Voovan JDK1.7兼容方法

  1. 当前 Voovan 开源项目是基于JDK1.8开发的,有很多朋友需要在 JDK1.7的环境中使用,那么现在来说说如何进行 JDK 的降级. 请使用201689日以后的 master 版本或者大于 v1.0-alpha-2 的版本. 因为很多朋友需要,以后的每个版本发布我都会做一个基于 JDK1.7的测试.
  2. 我按照一下方法修改一边到 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):

  1. public char getParameterAsObject(Class<?> clazz){
  2. try {
  3. return (char) TReflect.getObjectFromMap(clazz, TObject.cast(getParameters()), true);
  4. } catch (ReflectiveOperationException | ParseException e) {
  5. throw new RuntimeException("Conver parameters to "+clazz.getCanonicalName()+" error.",e);
  6. }
  7. }

我们可以看到调用TReflect.getObjectFromMap方法的第二个参数TObject.cast(getParameters())有异常.那么我们改如何修改呢:首先查看被调用方法的参数说明:

  1. public static Object getObjectFromMap(Class<?> clazz,Map<String, ?> mapArg,boolean ignoreCase)

我们可以看到第二个参数的类型是 Map<String, ?>.我们在看看getParameters()的声明是 Map<String,String>.那么我们参照这个声明修改:

  1. return (char) TReflect.getObjectFromMap(clazz, (Map<String, String>)getParameters(), true);

为传统的类型转换:

  1. return (char) TReflect.getObjectFromMap(clazz, TObject.cast(getParameters()), true);

总的思路是:查看被调用方法需要的是什么类型的参数,然后将当前参数强制转换成需要的参数类型.


Step4. lambda表达式导致的异常

这类异常主要是在类型转换的过程中出现的异常. 下面来看看如何处理:输入图片说明

通过上图我们可以看到 IDE 报告的两个编译异常.我们用第一个异常来举例,双击第一个异常(很多 IDE 都支持,例如:Eclipse)

  1. //循环放入独立的线程中处理
  2. Global.getThreadPool().execute( () -> {
  3. nioSelector.eventChose();
  4. });

这里用了一个 lambda 表达是来简化了一个内部类的熟悉可以修改成:

  1. //循环放入独立的线程中处理
  2. Global.getThreadPool().execute( new Thread(){
  3. @Override
  4. public void run() {
  5. nioSelector.eventChose();
  6. }
  7. });

其实就是将:

  1. () -> {

替换成:

  1. new Thread(){

然后将:

  1. nioSelector.eventChose();

替换成:

  1. @Override
  2. public void run() {
  3. nioSelector.eventChose();
  4. }

这个时候有可能还会出现异常:原因是由于内部类的对象必须是 final 的,有的时候需要将内部类使用的对象在声明处修改为 final.

目前整个框架中仅仅只有两点是在降级时需要特别注意的,后续如有新的部分我会即时补充.