zoukankan      html  css  js  c++  java
  • dubbo实现原理之动态编译

      Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,对于扩展或则策略选择的设配类能够动态生成。对于一些需求已知的类如Protocal,它们的设配类代码dubbo可以直接的提供,但是dubbo作为一个高扩展性的框架,为了使用户能够添加自己的需求,根据配置动态生成自己的设配类代码,这样就需要在运行的时候去编译加载这个设配类的代码,下面我们分析一下buddo的动态编译。

      dubbo动态编译的实现类图如下:

      Compiler接口的定义如下:

    @SPI("javassist")
    public interface Compiler {
    
        /**
         * 编译java源码
         * @param code  java源码
         * @param classLoader TODO
         * @return Compiled class
         */
        Class<?> compile(String code, ClassLoader classLoader);
    
    }

      SPI注解表示如果没有配置,dubbo默认选用javassist编译源代码,接口方法compile第一个入参code,就是java的源代码,接口方法compile第二个入参classLoader,按理是类加载器用来加载编译后的字节码,其实没用到,都是根据当前线程或者调用方的classLoader加载的。

      设配类AdaptiveCompiler定义如下:

    @Adaptive
    public class AdaptiveCompiler implements Compiler {
    
        private static volatile String DEFAULT_COMPILER;
    
        public static void setDefaultCompiler(String compiler) {
            DEFAULT_COMPILER = compiler;
        }
    
        public Class<?> compile(String code, ClassLoader classLoader) {
            Compiler compiler;
            ExtensionLoader<Compiler> loader = ExtensionLoader.getExtensionLoader(Compiler.class);
            String name = DEFAULT_COMPILER; // copy reference
            if (name != null && name.length() > 0) {
                compiler = loader.getExtension(name);
            } else {
                compiler = loader.getDefaultExtension();
            }
            return compiler.compile(code, classLoader);
        }
    
    }

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

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

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

      

  • 相关阅读:
    安装虚拟环境virtualenv
    安装python3、ipython、jupyter
    配置yum源
    面向对象
    sqrt开平方算法的尝试,是的看了卡马克大叔的代码,我来试试用C#写个0x5f3759df和0x5f375a86跟System.Math.Sqrt到底哪个更强
    python开发环境
    phthon中的open函数模式
    picoscope 动态链接库调用位置确定,可进行图标编辑
    设计模式笔记(2)-工厂模式
    设计模式笔记(1)-单体模式
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8621675.html
Copyright © 2011-2022 走看看