Java ClassTransformer未执行
用例 我正试图编写一个JavaSE8Java ClassTransformer未执行,java,javaagents,Java,Javaagents,用例 我正试图编写一个JavaSE8ClassFileTransformer实现。其目标是调试。我很清楚BTrace,但它并不真正适合我所做的事情。也就是说,是内部方法级检查。BTrace将其断点限制为进入/退出。我想了解这件事的细节 所以我想我现在应该自己做这件事,难吗 (是ByteBuddy和BTrace使用的字节码操作库) 问题 因此,我首先定义了一个简单的ClassFileTransformer public class PreMainInjection { public st
ClassFileTransformer
实现。其目标是调试。我很清楚BTrace,但它并不真正适合我所做的事情。也就是说,是内部方法级检查。BTrace将其断点限制为进入/退出。我想了解这件事的细节
所以我想我现在应该自己做这件事,难吗
(是ByteBuddy和BTrace使用的字节码操作库)
问题 因此,我首先定义了一个简单的
ClassFileTransformer
public class PreMainInjection {
public static void premain(String agentArgs,
Instrumentation inst) {
inst.addTransformer(new EntryPoint(), true);
}
}
public class EntryPoint implements ClassFileTransformer {
public EntryPoint() { }
@Override
public byte[] transform(ClassLoader classloader, String name,
Class<?> clazz, ProtectionDomain prot, byte[] data) {
System.out.printf("Loaded: %s\n", name);
}
}
该应用程序仍然有效,我可以看到输出。所以我很困惑。回答你的第一个问题ASM有多难:非常难 要了解实际情况:在到达打印输出之前,您可能会遇到一个异常。对于类文件转换器,如果异常转义
transform
方法,则会抑制异常。您是否尝试将代码包装在try-catch块中以查看是否引发了异常
您也有可能没有与您的代理捆绑ASM。在这种情况下,在转换器的执行过程中会出现错误而不是异常。最后,我将尝试不使用帧计算的代理,因为这需要访问所有引用的类文件,这也可能是问题的根源。因此,我似乎遇到了一个奇怪的边缘情况
ClassNode
的内部字段仅在对ClassReader
进行完整访问后才实例化。在这种情况下,它是静态可证明的System.out.printf(“名称:%s”,node.Name)
将在编译时始终返回NullPointerException
所以我相信JVM根本不会加载我的ClassFileTransformer
无论哪种方式,我都能让系统正常工作。什么是
ASM
代表?@MarkStewart?ASM:它是一个javabyte代码操纵库。更新OP以反映这一点,并提供更好的参考。
public class PreMainInjection {
public static void premain(String agentArgs,
Instrumentation inst) {
inst.addTransformer(new EntryPoint(), true);
}
}
public class EntryPoint implements ClassFileTransformer {
public EntryPoint() { }
@Override
public byte[] transform(ClassLoader classloader, String name,
Class<?> clazz, ProtectionDomain prot, byte[] data) {
ClassReader reader = new ClassReader(bytes);
ClassNode node = new ClassNode();
ClassWriter writer = new ClassWriter(
ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
reader.accept(node, ClassReader.EXPAND_FRAMES);
System.out.printf("Name: %s", node.name);
node.accept(writer);
return writer.toByteArray();
}
}
System.out.printf("Loaded %s\n", name);
return null;