【发布时间】:2017-11-10 03:52:34
【问题描述】:
我是 Java ASM 的新手。我正在尝试使用 Java 代理和 ASM 检测方法。但是,我收到如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: java.io.FileOutputStream$1.<init>(Ljava/io/FileOutputStream;)V
at java.io.FileOutputStream.close(FileOutputStream.java:354)
at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:320)
at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)
at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233)
at WriteToFileExample.useFileWriter(WriteToFileExample.java:60)
at WriteToFileExample.main(WriteToFileExample.java:30)
我正在使用 asm-6.0。
我尝试编写简单的测试代码并且它可以工作。但是,对于某些类中的某些方法,它不起作用。我不明白为什么! ClassVisitor 正在访问该类,然后对于所有方法,它都接受 MethodVisitor。如果类中不存在这样的方法,它如何接受访问者以及为什么抛出异常?
【问题讨论】:
-
访问者是按照原始代码调用的,在你做出破坏代码的更改之前。
-
是的。你是对的。我知道访问者是根据测试代码调用的。但是,它说找不到的方法是它基于测试代码获得的类中的方法。那么,为什么没有这种方法呢?
-
我不知道“它说找不到的方法是它基于测试代码获得的类中的方法”应该是什么意思。我开始想知道您在想什么,a)尚未找到哪个方法,b)哪个方法包含/导致错误......
-
我想我已经明白了。 FileOutputStream$1 是 FileOutputSram 的一个内部类。使用 java 代理,我没有获得有关 FileOutputStream 的信息,而是获得了有关 FileOutputStream$1 的信息。但是,当访问方法时,它说没有找到 init 的此类方法,因为 FileOutputStream$1 中没有 init 方法。 Init 方法在 FileOutputStream 中。我将 java 代理代码更改为不处理内部类,而是处理实际的 FileOutputStream 类,现在可以了。
-
名称
<init>表示一个构造函数。当然,两个类都有构造函数。对于匿名类,它是编译器生成的构造函数。由于代码适用于其他所有人,因此您的代理必须修改该类。
标签: bytecode instrumentation java-bytecode-asm javaagents