Voovan JDK1.7兼容方法
当前 Voovan 开源项目是基于JDK1.8开发的,有很多朋友需要在 JDK1.7的环境中使用,那么现在来说说如何进行 JDK 的降级. 请使用2016年8月9日以后的 master 版本或者大于 v1.0-alpha-2 的版本. 因为很多朋友需要,以后的每个版本发布我都会做一个基于 JDK1.7的测试.
我按照一下方法修改一边到 JDK1.7 所消耗的时间为5分钟.
下载:[voovan-framework-20160809-jdk1.7.jar]
Step1. 获取最新代码的版本
git clone https://git.oschina.net/helyho/Voovan.git
Step2. 将当前版本版本调整到 JDK1.7并进行编译
- 具体根据使用的 IDE 或者构建工具的不同,请大家自行调整.
- 进行编译,很显然会出现很多很多的错误.那么第三部会告诉大家如何处理这些错误.
Step3. TOjbect.cast()方法导致的异常
TOjbect.cast()方法是基于 JDK1.8更加完善的拆包封包功能实现的类型自动转换方法,在 JDK1.7中不能完全兼容. 这类异常主要是在类型转换的过程中出现的异常.
通过上图我们可以看到 IDE 报告的7个编译异常.我们用第一个异常来举例,双击第一个异常(很多 IDE 都支持,例如:Eclipse):
public char getParameterAsObject(Class<?> clazz){
try {
return (char) TReflect.getObjectFromMap(clazz, TObject.cast(getParameters()), true);
} catch (ReflectiveOperationException | ParseException e) {
throw new RuntimeException("Conver parameters to "+clazz.getCanonicalName()+" error.",e);
}
}
我们可以看到调用TReflect.getObjectFromMap方法的第二个参数TObject.cast(getParameters())有异常.那么我们改如何修改呢:首先查看被调用方法的参数说明:
public static Object getObjectFromMap(Class<?> clazz,Map<String, ?> mapArg,boolean ignoreCase)
我们可以看到第二个参数的类型是 Map<String, ?>.我们在看看getParameters()的声明是 Map<String,String>.那么我们参照这个声明修改:
return (char) TReflect.getObjectFromMap(clazz, (Map<String, String>)getParameters(), true);
为传统的类型转换:
return (char) TReflect.getObjectFromMap(clazz, TObject.cast(getParameters()), true);
总的思路是:查看被调用方法需要的是什么类型的参数,然后将当前参数强制转换成需要的参数类型.
Step4. lambda表达式导致的异常
这类异常主要是在类型转换的过程中出现的异常. 下面来看看如何处理:
通过上图我们可以看到 IDE 报告的两个编译异常.我们用第一个异常来举例,双击第一个异常(很多 IDE 都支持,例如:Eclipse)
//循环放入独立的线程中处理
Global.getThreadPool().execute( () -> {
nioSelector.eventChose();
});
这里用了一个 lambda 表达是来简化了一个内部类的熟悉可以修改成:
//循环放入独立的线程中处理
Global.getThreadPool().execute( new Thread(){
@Override
public void run() {
nioSelector.eventChose();
}
});
其实就是将:
() -> {
替换成:
new Thread(){
然后将:
nioSelector.eventChose();
替换成:
@Override
public void run() {
nioSelector.eventChose();
}
这个时候有可能还会出现异常:原因是由于内部类的对象必须是 final 的,有的时候需要将内部类使用的对象在声明处修改为 final.
目前整个框架中仅仅只有两点是在降级时需要特别注意的,后续如有新的部分我会即时补充.