• Voovan JDK1.7兼容方法
    • Step1. 获取最新代码的版本
    • Step2. 将当前版本版本调整到 JDK1.7并进行编译
    • Step3. TOjbect.cast()方法导致的异常
    • Step4. lambda表达式导致的异常

    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.

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