Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClassTransformer未执行_Java_Javaagents - Fatal编程技术网

Java ClassTransformer未执行

Java ClassTransformer未执行,java,javaagents,Java,Javaagents,用例 我正试图编写一个JavaSE8ClassFileTransformer实现。其目标是调试。我很清楚BTrace,但它并不真正适合我所做的事情。也就是说,是内部方法级检查。BTrace将其断点限制为进入/退出。我想了解这件事的细节 所以我想我现在应该自己做这件事,难吗 (是ByteBuddy和BTrace使用的字节码操作库) 问题 因此,我首先定义了一个简单的ClassFileTransformer public class PreMainInjection { public st

用例

我正试图编写一个JavaSE8
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;