• 【DUBBO】 Dubbo内核实现之动态编译


    转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577483

    我们运行的java代码,一般都是编译之后的字节码。Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,对于扩展或者说是 策略的选择这个叫做控制类也好设配类也好的类要能够动态生成。当然对应已知需求如Protocol, ProxyFactory他们的策略选择的设配类代码dubbo直接提供也无妨,但是dubbo作为一个高扩展性的框架,使得用户能够添加自己的需求,根 据配置动态生成自己的设配类代码,这样就需要在运行的时候去编译加载这个设配类的代码。下面我们就是来了解下Dubbo的动态编译。

    动态编译的实现的类图

     

    编译接口定义

    @SPI("javassist")

    public interface Compiler {

    Class<?> compile(String code, ClassLoaderclassLoader);

    }

    SPI注解表示如果没有配置,dubbo默认选用javassist编译源代码

    接口方法compile第一个入参code,就是java的源代码

    接口方法compile第二个入参classLoader,按理是类加载器用来加载编译后的字节码,其实没用到,都是根据当前线程或者调用方的classLoader加载的

    @Adaptive

    public class AdaptiveCompiler implements Compiler {

        private static volatile String DEFAULT_COMPILER;

        publicClass<?> compile(String code, ClassLoader classLoader) {

            Compiler compiler;

            ExtensionLoader<Compiler> loader= ExtensionLoader.getExtensionLoader(Compiler.class);

            String name = DEFAULT_COMPILER;// copyreference

            if (name !=null && name.length() > 0) {

                compiler =loader.getExtension(name);

            } else {

                compiler =loader.getDefaultExtension();

            }

            returncompiler.compile(code, classLoader);

        }

    }

    AdaptiveCompiler是Compiler的设配类, 它有类注解@Adaptive表示这个Compile r的设配类不是动态编译生成的。AdaptiveCompiler作用就是策略的选择,根据条件选择何种编译策略来编译动态生成的源代码。

    AbstractCompiler为编译的抽象类,抽象出公用逻辑,这里它主要是利用正则匹配出源代码中的包名和类名后先在jvm中Class.forName看下是否存在,如果存在反回,不存在在执行编译与加载。

    关于JavassistCompiler和JdkCompiler执行doCompile的过程都是利用Javassit和Jdk提供的相关api或者扩展接口实现的。

  • 相关阅读:
    C#中使用$"{}"替换string.Format()
    js==>id-pid转children【】树结构数据
    React使用模板
    C#--fetch配置使用
    ...扩展运算符解释
    java之死锁
    Stream流
    lambda 之 forEach( ->{} )
    java基础之递归(九九乘法表)
    java读取 .xlsx格式文件转成list
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/8109564.html
Copyright © 2020-2023  润新知