我使用JDK1.8和asm-4.0
我想将监视器代码添加到某个类中,因此我使用java代理和asm4来操作字节代码。 核心代码如下:
public class MyClassFileTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
if (className.startsWith("com/dgl/asm/SleepClass")) {
ClassReader reader = new ClassReader(classfileBuffer);
System.out.println("1231231231312");
ClassWriter cw = new ClassWriter(reader,0);
ClassVisitor adpter = new AddTimerClassAdpter(Opcodes.ASM4, cw);
reader.accept(adpter, 0);
return cw.toByteArray();
}
return classfileBuffer;
}
}
但是,ClassReader reader = new ClassReader(classfileBuffer)
之后的代码始终无法访问。例如,永远不会执行代码System.out.println("1231231231312")
。执行ClassReader reader = new ClassReader(classfileBuffer)
后,程序直接跳转到main方法,没有任何异常!我使用断点并对其进行调试,但找不到任何有价值的迹线。
我该怎么办?有什么想法吗?
我写了一个测试类如下:
public static void main(String [] args) throws InterruptedException, IOException{
System.out.println("before");
ClassReader cr=new ClassReader("com/cn/main/Girl");
System.out.println("after");
}
正如我所假设的,System.out.println("before")
可以执行,但System.out.println("after")
无法执行。它显示错误如下:
Exception in thread "main" java.lang.IllegalArgumentException
at org.objectweb.asm.ClassReader.<init>(Unknown Source)
at org.objectweb.asm.ClassReader.<init>(Unknown Source)
at org.objectweb.asm.ClassReader.<init>(Unknown Source)
所以我将new ClassReader("com/cn/main/Girl")
替换为new ClassReader("com.cn.main.Girl")
,但错误仍然存在。
答案 0 :(得分:0)
原因是asm-4.0与jdk1.8不兼容,因为如果我用asm-all-5.0.3.jar替换asm-4.0,程序将运行良好。 但是,如果我使用jdk1.7和asm-4.0,问题仍然是