【问题标题】:Java ASM java.lang.NoSuchMethodErrorJava ASM java.lang.NoSuchMethodError
【发布时间】: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 类,现在可以了。
  • 名称&lt;init&gt; 表示一个构造函数。当然,两个类都有构造函数。对于匿名类,它是编译器生成的构造函数。由于代码适用于其他所有人,因此您的代理必须修改该类。

标签: bytecode instrumentation java-bytecode-asm javaagents


【解决方案1】:

我想通了。 FileOutputStream$1 是 FileOutputSram 的一个内部类。使用 java 代理,我没有获得有关 FileOutputStream 的信息,而是获得了有关 FileOutputStream$1 的信息。但是,当访问方法时,它说没有找到名为 init 的方法,对于其他一些方法,因为 FileOutputStream$1 中没有 init 方法。 Init 方法在 FileOutputStream 中。我将 java 代理代码更改为不处理内部类,而是处理实际的 FileOutputStream 类,现在可以了。

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多