使用asm完成字节码检测时抛出java.lang.reflect.InvocationTargetException。

时间:2013-05-15 15:02:03

标签: java instrumentation invocationtargetexception

我想在Java中使用一些方法/类。为此,我写了一个Java代理,它只检测我选择的几个类。

我使用以下代码来获取加载的类并过滤其中的一些:

 instrumentation.addTransformer(myTransformer,true);

 Class[] loadedClasses=instrumentation.getAllLoadedClasses();

 Class[] modifiableClasses=ModifiableClasses(loadedClasses,instrumentation);

Class[] filteredClasses=filterClasses(modifiableClasses);

if(instrumentation.isRetransformClassesSupported()){
        System.out.println("retransformation is Supported");
        instrumentation.retransformClasses(filteredClasses);
     }

这不应该造成任何问题filterClasses返回一些我想要检测的类通常我想要检测这些类:

  • Ljava / NIO /缓冲液;
  • Ljava / util的/ HashMap中$条目;
  • Ljava / NIO / HeapCharBuffer;
  • Ljava / NIO / CharBuffer的;
  • Ljava /郎/类加载器;
  • Ljava /郎/类;
  • Ljava / util的/ HashMap中;
  • Ljava / NIO /字节缓冲区;
  • Ljava /郎/系统;
  • Ljava / IO /的BufferedWriter;
  • Ljava /郎/字符串;
  • Ljava / IO / OutputStreamWriter;
  • Ljava / IO /的BufferedOutputStream;
  • Ljava / NIO /字符集/的CoderResult;
  • Ljava / IO /写入器;
  • Ljava / util的/ HashSet的;
  • Ljava / NIO /字符集/ CharsetEncoder;
  • Ljava / IO / FileOutputStream中;
  • Ljava / IO /的PrintStream;

一切正常我在特定文件夹中打印已检测和未测试的类以进行调试。我使用asm CoreAPI在方法的开头和结尾添加一些指令我不会使用构造函数,本机方法,抽象方法和静态变量。当我只是检测正在加载的新类时,一切正常。我想我不明白使用ClassLoader或者具体的东西是我在控制台上获得的东西:

    Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(Unknown Source)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(Unknown Source)
     Caused by: java.lang.InternalError
    at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
    at sun.instrument.InstrumentationImpl.retransformClasses(Unknown Source)
    at my.Agent.Watcher.premain(Watcher.java:88)
    ... 6 more
    FATAL ERROR in native method: processing of -javaagent failed

我感谢任何帮助,我甚至可以获得正确方向的链接或暗示。

1 个答案:

答案 0 :(得分:0)

对不起家伙我的错误在更精确地查看已经发现的错误的类中我发现了错误,如果我希望这可以解决的话。 admin / mod可以关闭这个帖子。