ClassLoader实践(apache-skywalking AgentClassLoader分析)

前言

主要学习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是符合双亲委派机制的,加载插件都会向上委派去加载。加载插件的主要过程。

  1. 指定加载类的路径。
  2. 从指定路径下,获取kywalking-plugin.def文件。
  3. 加载文件中指定的类。

AgentClassLoader,通过规定的文件加载具体的类。在springboot中也有同样的实现。学习ClassLoader,巩固基础,增加内力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值