ClassReader的对象无法在asm-4.0中创建

时间:2016-02-18 14:57:44

标签: java bytecode

我使用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"),但错误仍然存​​在。

1 个答案:

答案 0 :(得分:0)

原因是asm-4.0与jdk1.8不兼容,因为如果我用asm-all-5.0.3.jar替换asm-4.0,程序将运行良好。 但是,如果我使用jdk1.7和asm-4.0,问题仍然是