java代理-插入选定文件(排除所有内置java类和方法)

java代理-插入选定文件(排除所有内置java类和方法),java,java-bytecode-asm,javaagents,Java,Java Bytecode Asm,Javaagents,我正在编写我的第一个java代理。我正在尝试对我从git回购(不是我自己开发的)中挑选的一个项目进行测试 我已经用premain方法编写了代理类,并实现了一些日志记录(记录使用ASM字节码操作框架执行的行数) 然而,我发现即使是内置的java函数调用/类也被检测到了,这是不正确的。我只希望检测项目中的文件。为了实现这一点,我添加了如下所示的过滤器- public static void premain(String agentArgs, Instrumentation inst) {

我正在编写我的第一个java代理。我正在尝试对我从git回购(不是我自己开发的)中挑选的一个项目进行测试

我已经用premain方法编写了代理类,并实现了一些日志记录(记录使用ASM字节码操作框架执行的行数)

然而,我发现即使是内置的java函数调用/类也被检测到了,这是不正确的。我只希望检测项目中的文件。为了实现这一点,我添加了如下所示的过滤器-

  public static void premain(String agentArgs, Instrumentation inst) {

    System.out.println("Premain called");

    inst.addTransformer(new ClassFileTransformer() {
      public byte[] transform(ClassLoader classLoader, 
                              String className,
                              Class<?> classBeingRedefined, 
                              ProtectionDomain protectionDomain, 
                              byte[] bytes)throws IllegalClassFormatException {


        // ASM Code
        if(className.startsWith("org/mytestpackage/")){
          ClassReader reader = new ClassReader(bytes);
          ClassWriter writer = new ClassWriter(reader, 0);
          ClassTransformVisitor visitor = new ClassTransformVisitor(writer);
          reader.accept(visitor, 0);
          return writer.toByteArray();
        } 

        return null;

      }
    });

  }
public static void premain(字符串代理、仪器仪表){
System.out.println(“称为Premain”);
inst.addTransformer(新的ClassFileTransformer(){
公共字节[]转换(类加载器类加载器,
字符串类名称,
类被重新定义,
ProtectionDomain ProtectionDomain,
字节[]字节)引发IllegalClassFormatException{
//ASM代码
if(className.startsWith(“org/mytestpackage/”){
ClassReader=新的ClassReader(字节);
ClassWriter=newclasswriter(reader,0);
ClassTransformVisitor=新建ClassTransformVisitor(编写器);
reader.accept(访问者,0);
返回writer.toByteArray();
} 
返回null;
}
});
}
在我添加了这个过滤器之后,正在调用premain,但是我遇到了一些异常

initializationError(org.mytestpackage.TestAllPackages)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.VerifyError: (class: org/mytestpackage/TestAllPackages, method: main signature: ([Ljava/lang/String;)V) Stack size too large
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)

初始化错误(org.mytestpackage.TestAllPackages)经过的时间:0.002秒您的
ClassTransformVisitor
似乎破坏了转换案例的代码。在您的特定情况下,它似乎不会调整类中方法的堆栈大小
org.mytestpackage.TestAllPackages


验证器错误
堆栈大小过大
表示向方法的操作数堆栈推送的值多于为此堆栈指定的插槽。您可以要求ASM通过指定
new ClassWriter(reader,ClassWriter.COMPUTE\u MAXS)

来解决此问题,这就是问题所在。他们认为我创建classwriter的方式似乎是造成问题的原因。谢谢。如果你不是自己计算最大尺寸,我猜你也不是在创建堆叠贴图帧。因此,如果类版本为50或更高,您应该使用
ClassWriter.COMPUTE\u FRAMES
来计算两者。