静态编译:源文件--->javac--->.class--->JM运行加载--->Class对象--->实例对象。
动态编译: JVM运行时把源文件javac--->.class--->Class对象--->实例对象。
在调用ServiceConfig.export()方法的时候,在生成Invoker的时候回使用到Protocol的具体实现对象,
image.png
其中getAdaptiveExtension()就回使用到动态编译技术,进入此方法
image.png
可以看到this.createAdaptiveExtension()方法回返回具体的对象
this.getExtensionClasses()就是去对应的目录下加载java文件。
image.png
image.png
createAdaptiveExtensionClass()方法中,其中的code就是已经产生的源码,现在需要对code进行编译并生成Class对象通过newInstance()即可获得需要的对象。
Dubbo中使用Compiler接口来编译,其步骤与上述相同
这就是Dubbo的动态编译









网友评论