0

我想在 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$Entry;
  • Ljava/nio/HeapCharBuffer;
  • Ljava/nio/CharBuffer;
  • Ljava/lang/类加载器;
  • Ljava/语言/类;
  • Ljava/util/HashMap;
  • Ljava/nio/字节缓冲区;
  • Ljava/语言/系统;
  • Ljava/io/BufferedWriter;
  • Ljava/语言/字符串;
  • Ljava/io/OutputStreamWriter;
  • Ljava/io/BufferedOutputStream;
  • Ljava/nio/charset/CoderResult;
  • Ljava/io/作家;
  • Ljava/util/HashSet;
  • Ljava/nio/charset/CharsetEncoder;
  • Ljava/io/文件输出流;
  • 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

我很感谢任何帮助,我什至可以在正确的方向上获得链接或提示。

4

1 回答 1

0

抱歉,在更精确地查看仪表类之后,我发现了我的错误,如果我想让它起作用,我将不得不解决这些错误。管理员/国防部可以关闭此线程。

于 2013-05-16T14:08:06.893 回答