关于ClassFileTransformer
该接口是javaagent的 Instrumentation.addTransformer 方法的入参之一,用于给加载的类添加一个类转换器,确保在类进入main方法之前,对类进行字节码插桩。
接口函数说明
该接口只有一个方法,即
byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer);
接口中明确说到,当你不需要对一个类的字节码进行处理的时候,就返回 null 或者 new byte[0]。而如果需要处理的时候,就返回一个新的字节数组。
注意点说明
当你只有一个 ClassFileTransformer 实现类时,上面的处理逻辑是没问题的,可如果你添加了多个 ClassFileTransformer 的时候,就需要更新一下逻辑。多个 ClassFileTransformer 会链式调用,上一个转换器处理后的字节码数组,会变成 classfileBuffer 入参给到下一个转换器。
也就是说,你的某个转换器,如果不需要处理某个类的字节码数组时,不能再返回 null 或者 new byte[0],这样会导致转换器链式调用结束后,其它转换器转换后的字节码数组被覆盖,这时候是应该要返回入参的 classfileBuffer 属性的。
示例说明

![[SSD固态硬盘技术 19] 谁是数据的守护神? 盘内RAID1/RAID5图文详解_盘内数据冗余保护](https://img-blog.csdnimg.cn/img_convert/6f214260a60b403ea71d60d89e55bb6b.png)

















