关于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
属性的。