前言
主要学习AgentClassLoader, 如何获取skywalking-plugin.def文件,如何通过该文件加载类插件的
AgentClassLoader加载插件说明
AgentClassLoader获取的是 plugins、activations目录下的jar。 从jar中读取skywalking-plugin.def文件内容,该文件中指定了需要加载的类。也就是AgentClassLoader是通过skywalking-plugin.def文件加载插件的。
plugins、activations目录:
skywalking-plugin.def文件,以plugins\apm-activemq-5.x-plugin-8.3.0.jar为例:
skywalking-plugin.def文件指定的类,都间接或者直接的继承AbstractClassEnhancePluginDefine类。其他插件也是一样的。
代码分析
Agent启动类
进入PluginBootstrap#loadPlugins中分析
1. 初始化AgentClassLoader,主要是将 plugins、activations目录加入到classpath集合中。AgentClassLoader的父加载器,一般都是AppClassLoader。父加载器不是父类。父加载器和AgentClassLoader是组合关系。AgentClassLoader父类是ClassLoader。
2. 获取资源。主要是从 plugins、activations目录下获取skywalking-plugin.def文件,并转为url对象,存入到集合中。
3. 加载URL资源,主要是读取skywalking-plugin.def文件内容,每一行封装成一个PluginDefine对象。
4. 加载kywalking-plugin.def文件中指定的类。
AgentClassLoader中,没有重写loadClass方法,也就是说遵循了双亲委派机制,AgentClassLoader加载类调用的是父类ClassLoader的loadClass方法。loadClass方法中会调用findClass方法,AgentClassLoader对findClass方法进行了重写。
总结:
AgentClassLoader是符合双亲委派机制的,加载插件都会向上委派去加载。加载插件的主要过程。
- 指定加载类的路径。
- 从指定路径下,获取kywalking-plugin.def文件。
- 加载文件中指定的类。
AgentClassLoader,通过规定的文件加载具体的类。在springboot中也有同样的实现。学习ClassLoader,巩固基础,增加内力。