问题标签 [java-bytecode-asm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2293 浏览

java - 休眠 org.objectweb.asm.classwriter

当我运行我的 java 应用程序时出现此错误,我使用 hibernate:

java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter

我添加了所有的asm罐子

安慰:

0 投票
3 回答
6044 浏览

java - ASM - 如何从 Java 字节码名称转换 Java 类名称?

我正在使用 ASM(一个字节码修改库),它提供了对字节码命名格式的类型名称的访问,例如,据报道一个字符串字段具有以下描述:Ljava/lang/String

我需要为某些类调用 Class.forName,但我需要类型名称的源代码形式,例如 java.lang.String。

有没有办法将内部名称转换为 Java 源格式?

0 投票
3 回答
4209 浏览

java - “最终”在运行时是最终的吗?

我一直在玩弄ASM,我相信我成功地将 final 修饰符添加到类的实例字段中;但是,然后我继续实例化所述类并在其上调用 setter,这成功地更改了 now-final 字段的值。我的字节码更改是否有问题,或者最终仅由 Java 编译器强制执行?

更新:(7 月 31 日)这里有一些代码给你。主要部分是

  1. 一个带有private int xandprivate final int y的简单 POJO
  2. MakeFieldsFinalClassAdapter,它使得它访问的每个字段都是最终的,除非它已经是,
  3. 和 AddSetYMethodVisitor,它会导致 POJO 的 setX() 方法也将 y 设置为与设置 x 相同的值。

换句话说,我们从一个具有一个 final (x) 和一个 non-final (y) 字段的类开始。我们使 x 最终。除了设置 x 之外,我们还让 setX() 设置 y。我们跑。x 和 y 都设置没有错误。代码在github 上。您可以使用以下命令克隆它:

有两件事需要注意:我首先提出这个问题的原因是:我设置为 final 的字段和已经设置为 final 的字段都可以使用我认为是正常的字节码指令进行设置。

另一个更新:(8 月 1 日)用 1.6.0_26-b03 和 1.7.0-b147 测试,结果相同。也就是说,JVM 在运行时愉快地修改了 final 字段。

最终(?)更新:(9 月 19 日)我从这篇文章中删除了完整的源代码,因为它相当长,但它仍然可以在 github 上找到(见上文)。

我相信我已经最终证明JDK7 JVM 违反了规范。(参见Stephen's answer 中的摘录。)在使用 ASM 修改字节码后,如前所述,我将其写回到类文件中。使用优秀的JD-GUI,这个类文件反编译成如下代码:

简单看一下应该会告诉您,由于重新分配了 final 字段,该类将永远不会编译,但是在普通的 JDK 6 或 7 中运行该类看起来像这样:

  1. 在我报告这方面的错误之前,还有其他人有意见吗?
  2. 谁能确认这应该是 JDK 6 中的错误还是仅 7 中的错误?
0 投票
1 回答
1837 浏览

bytecode-manipulation - 字节码检测 - 实现本机或 Java 代理?

如果我想使用字节码检测来实现分析器,我应该使用JVMTI编写本机代理还是应该使用包编写Java 代理java.lang.instrument

如果我想使用像ASM这样的库——如果你想创建一个严肃的分析器,这似乎是强制性的——我必须使用 java 代理。这让我很困惑,因为我认为本地代理可以做 Java 代理可以做的所有事情,甚至更多。但对我来说,编写 java 代理似乎更容易。

有替代品吗?无论如何都应该使用Java代理和本机代理吗?

0 投票
1 回答
569 浏览

java - Java OW2 ASM使用接口访问字节码类

我一直在尝试在网络上搜索指南/帮助,以通过在 ASM 中将字节码类转换为的接口访问字节码类。我已经在名为 powerbot (RSBot) 的 RuneScape 机器人上看到了这一点,我也从https://github.com/powerbot/RSBot获得了源代码但我无法理解它是如何完成的,因为当我将一个类转换为包含每个方法的“骨架”的接口时,我得到了类转换异常。我知道认为你可以将一个类转换为接口一定是愚蠢的。我知道必须有一些准备工作,但在 ASM 书籍/电子书 (http://download.forge.objectweb.org/asm/asm-guide.pdf) 中,就我所阅读的而言,没有任何关于它的内容。我对此真的很感兴趣,不是要制作一个新的 RS 机器人,而是要学习这个很酷的库来替换我需要的 BCEL。我会给你一个简单的例子来更好地理解这个问题!

在这里,我有一个名为“helloSO”的课程

在这里我也有名为“helloSO”的界面

我希望能够将我读取和定义的 .class 转换为使用 ASM 的类到该接口,以便能够使用它们的名称从该实例调用方法。我希望我能很好地解释这一点。如果你愿意,你可以检查 RSBot 以更好地了解我的意思。:) 所以我要问的是;我必须做哪些准备工作以及在哪里可以了解这些准备工作?我不是要您为我创建类适配器或任何建议和帮助:) 提前致谢!

0 投票
3 回答
3797 浏览

java - 在运行时实现抽象方法?

假设我有一个抽象类:

我想在运行时扩展以创建一个 Class 对象。希望我可以有一个动态生成的类:

这将由一个 Class 对象表示,然后我可以使用反射来创建新的实例。关键是我想在运行时决定方法 foo() 的返回值。我的想法是使用 ASM 为类创建字节码,然后在 ClassLoader 对象上使用反射来定义类。

使用 ASM,然后在生成的字节上反射方法 ClassLoader#defineClass 是在运行时使用非硬编码值实现抽象方法的最佳方式吗?

如果是,我将如何去做。我的直觉是使用 ASMifierClassVisitor,但我不太确定这样做的确切方法。我知道如果所有其他方法都失败了,我可以手动执行定义特定类所需的 JVM 指令,但我觉得必须有更简单的方法。

如果不是,最好的方法是什么,我将如何使用最好的方法?

编辑:我检查了所有的答案,我认为它们都不是我想要的。我最终创建了一个小型实现,用于实现我在 ASM 中所讨论的内容。我想我应该把它贴在这里:

0 投票
1 回答
2253 浏览

java - 使用 ASM 进行 Java 字节码操作

我正在使用 ASM 3.3.1。我正在尝试拦截一个类并更改其中一个方法。我正在使用 org.objectweb.asm.util.ASMifierClassVisitor 来获取 ASM 代码以创建新方法。一切都很好,但我无法理解 if() 语句。当我尝试使用带有 if 语句(或循环)的结果 asm 代码时,我在运行时收到“堆栈大小太大”错误。我正在使用 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);。这是它给我的 ASMIFY 代码。

你知道为什么我只会在 ASMIFYING if() 语句时得到一个错误吗?我将不胜感激任何帮助。

我正在 ASMifying 的代码。(注意:我已经取出了这个方法,因为这就是我正在使用的全部)

原始方法只包含最后两行

这看起来不太好。我使用了 CheckClassAdapter.verify() 方法,并为我正在搞乱的类的一部分得到了这个。

0 投票
3 回答
284 浏览

java - 用于特定 jvm 字节码模式的 grep

我正在处理一个有许多设计问题的遗留 Java 项目。结果,代码的某些部分没有按预期运行。考虑以下代码:

现在从上面的代码中,您可以清楚地看到 getChildren() 返回对数组的引用。因此,可以像这样更改数组的元素:

一些代码正在做类似上面提到的事情,我很难找到这个(grep 没有帮助)。

有没有什么工具可以帮助我使用 jvm 字节码分析来定位这个模式(坏代码),或者你会怎么做?

注意:由于某些限制,我无法更改父实现。

谢谢!

0 投票
1 回答
659 浏览

java - Asm ClassReader 接受

我正在使用Asm访问java字节码获取方法信息。似乎ClassReader类的accept方法是以异步方式调用的。所以无法立即获取方法信息。我该怎么办?

0 投票
2 回答
1497 浏览

java - 无法理解在 Java 中使用 ASM 字节码重命名的方法

我目前正在尝试了解 ASM 库的工作原理。我决定尝试重命名给定类的所有方法,所以我写了一个迷你MethodRenamer访问者:

它实际上完成了我的全部工作,但我不明白为什么。我认为使用给定的代码,它只会为每个方法m创建一个m_new没有代码的方法。但与我的预期相反,它以某种方式填充m_new了原始代码。

这怎么可能发生?我的想法是,只有我转发的内容cv才会写入输出文件。我没有cv在任何地方告诉原始m代码的代码是什么..所以我想这里肯定还有其他事情发生?唯一其他可行的选择似乎是以methodVisitor某种方式使用我的回报。