dubbo源码分析(二)动态编译

本文介绍了Dubbo框架中动态编译的实现原理,重点解析了Compiler接口与AdaptiveCompiler的作用,以及JavassistCompiler和JdkCompiler如何利用相关API进行代码编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

编译接口定义

@SPI("javassist")
public interface Compiler {
  Class<?> compile(String code, ClassLoader classLoader);
}
  • SPI注解的value表示如果没有配置,dubbo默认选用javassist编译源代码。
  • 接口方法compile第一个入参code,就是java的源代码。
  • 接口方法compile第二个入参classLoader,按理是类加载器用来加载编译后的字节码,其实没用到,都是根据当前线程或者调用方的classLoader加载的
@Adaptive
public class AdaptiveCompiler implements Compiler {

    private static volatile String DEFAULT_COMPILER;

    public Class<?> 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();

        }

        return compiler.compile(code, classLoader);
    }
}
  • AdaptiveCompiler是Compiler的设配类, 它有类注解@Adaptive表示这个Compile
    r的设配类不是动态编译生成的。
  • AdaptiveCompiler作用就是策略的选择,根据条件选择何种编译策略来编译动态生成的源代码。
  • AbstractCompiler为编译的抽象类,抽象出公用逻辑,这里它主要是利用正则匹配出源代码中的包名和类名后先在jvm中Class.forName看下是否存在,如果存在反回,不存在在执行编译与加载。
  • 关于JavassistCompiler和JdkCompiler执行doCompile的过程都是利用Javassit和Jdk提供的相关api或者扩展接口实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值