问题标签 [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 回答
271 浏览

java - ASM 检查类或包的使用情况

使用 ASM 如何知道 jar 中的编译代码是否使用特定的包或类,而不是检查类中的特定方法

0 投票
1 回答
752 浏览

java - 调用使用 Java ASM 添加的方法时发生 ClassFormatError 错误

我正在使用 Java ASM 向已编译的类添加方法。
在运行时,当调用新添加的方法时,我遇到了错误。

以下是我希望添加的方法

下面是这个的asm代码。

请有人可以帮助我确定我在这里做错了什么。非常感激您的帮忙。

0 投票
1 回答
180 浏览

java - Is there any tool to generate the ASM ClassWriter code?

I want to create dynamic java classes, I use a template to generate the source code, and then use jasper jdt to compile. But now, I want to remove the dependency for jdt and create class bytecode with ASM directly.

The source code is about 200 lines, is there any tool to help generate the byte code with ASM?

0 投票
2 回答
532 浏览

java - 使用 ASM 查找“隐式”变量的通用签名

我正在使用 ASM 4.0 构建依赖项搜索工具,但我发现了一个我无法解决的极端情况。我遇到的问题与在下面的代码中识别 MyClass 的用法有关。

可以使用 MethodVisitor.visitTypeInst() 来识别 ArrayList 的用法,但在该范围内没有可用的签名方法来识别泛型类型参数中的用法。MethodVisitor.visitLocalVariable() 也不是解决方案,因为没有创建本地变量。如果一个局部变量被显式声明为:

MethodVistor.visitLocalVariable() 工作正常,因为它通过签名参数提供对泛型类型信息的访问。只有在没有声明本地变量的隐式情况下,我才能找到访问泛型类型参数的方法。

我假设有某种方法可以使用此代码的通用信息访问类属性,但我不确定如何执行此操作。

谢谢你的帮助!!

0 投票
3 回答
8784 浏览

java-bytecode-asm - 动态 Java 字节码操作框架比较

有一些用于动态字节码生成、操作和编织的框架(BCEL、CGLIB、javassist、ASM、MPS)。我想了解它们,但是由于我没有太多时间了解它们的所有细节,所以我希望看到一种比较图表,说明一个与另一个的优缺点以及对它们的解释为什么。

在 SO 中,我发现很多问题都在问类似的问题,答案通常是“你可以使用 cglib 或 ASM”,或者“javassist 比 cglib 好”,或者“BCEL 已经老了,快要死了”或者“ASM 是最好的,因为它给出了 X 和 Y”。这些答案很有用,但并没有完全回答我想要的范围内的问题,更深入地比较它们并给出每个的优缺点。

0 投票
2 回答
259 浏览

compiler-construction - Java 到 Java 字节码编译器:如何获取 Java 类库信息?

我正在通过编译为Jasmin代码并组装它来编写 Java 到 Java 字节码编译器。我创建它的目的是使源代码文件能够引用和使用 Java 库类(对于字符串、打印等,您几乎必须这样做)。我的问题是如何去做这件事。

到目前为止,我一直在使用对所有库类列表的引用,该列表保存在 Java 安装文件夹中的文本文件中(它只是列出了它们的包和名称)。我已经在对解析器/类型检查器进行编码时使用了它,尽管这不太理想,因为在使用库类时类型检查器无法进行任何类型检查。

现在我正在处理代码生成,这确实是一个问题,因为如果你想调用库类的方法,你必须给它完整的方法签名——我无法访问的东西。

我在徘徊人们对如何进步的建议。一种方法是遍历所有类,创建一个包含所有参数和返回类型的数据库/列表。这显然会非常耗时,而且可能太不切实际。还有其他更优雅的方法吗?

谢谢,威尔

PS我正在使用Python对此进行编码。我想如果解决方案必须使用 Java 代码,我可以将它作为子进程运行。

0 投票
1 回答
271 浏览

java - java bytecode:two for-loop on onmethodExit

i have a test method:

so,I want insert two for-loop code to the method, to new list before and after, asm code same is :

first for-loop is right in new class file, but second for-loop is wrong and return is lost, code same:

Where has the problem, thank you very much

0 投票
3 回答
510 浏览

java - 最好的选择?在编译之前编辑字节码 (asm) 或编辑 java 文件

目标

  • 检测变量之间的比较和副本在哪里进行
  • 在操作发生的行附近注入代码
  • 代码的目的:每次运行类时都会增加一个计数器

通用:计算使用某些参数执行后进行的比较和复制的数量

2 个选项

注意:我总是有一个 .java 文件开头

1)编辑java文件


查找与正则表达式的比较并在行附近注入代码片段然后编译类(我的应用程序使用JavaCompiler)

2)使用ASM字节码工程


还检测我想要跟踪的事件并将片段注入字节码然后使用(已经编译但修改)类

我的问题

最好/最干净的方法是什么?有一个更好的方法吗?

0 投票
1 回答
1685 浏览

java - 如何在 asm 代码中正确使用 Instrumentation.retransformClasses()?

我正在使用 asm 库来执行一些 Java 字节码修改 - 特别是修改我的类以实现新接口和相关方法。我目前的方法是通过 javaagent 使用核心 asm API。我想保留这种动态方法,而不是静态修改 .class 文件。

在更高的层面上,我的问题是,如果我选择修改从 B 扩展而来的类 A,我还需要修改 B。(鉴于我对 JVM 中如何加载类的理解,我相信类 B 将永远是在 A 课之前交给变压器。(如果我错了,请纠正我)。鉴于这个假设,我认为我需要返回并重新转换B。我的方法在这段代码中得到了体现:

(是在构造函数中传入inst的句柄)Instrumentation

我遇到困难的部分是评论中标有**2**. 让我们再说一遍 A 扩展了 B 并且我对转换 A 很“感兴趣”。我期待的是我会看到超类 (B) 的名称被打印在**1**(但没有被转换,因为我不认为第一遍很有趣)然后,一旦我到达**2**并发现 A 的超类是 B,我应该尝试重新转换 B。此时我希望再次调用此方法(通过inst.retransformClasses())并且我会见 B 打印在**1**。但是,我没有。(我已经添加了打印语句,并且确信我已经到达了 retransform 调用。我也检查了它Instrumentation.isRetransformClassesSupported()并且Instrumentation.isModifiableClass(c)都返回 true)。

我相信我已经正确设置了代理;在清单中将 Can-Retransform-Classes 和 Can-Redefine-Classes 设置为 true。此外,当我在代理的方法中将变压器添加到 Instrumentation 时,premain我会这样做:

关于我在这里做错了什么的任何见解?谢谢。

0 投票
2 回答
616 浏览

java - 使用 ASM 检测字段突变

我想检测一个类的方法之一是否使用 ASM 改变了某个实例字段。例如:

问题:实例字段 o 是否被 Box 类的方法之一改变了?在这种情况下,是的。

使用 ASM 树库中的 MethodNode 类,我可以获得如下所示的方法的操作码

这个数组包含 putfield 的操作码 181,但我怎么知道它是分配的字段 Box.o?

顺便说一句:为什么数组包含 -1 值?

肿瘤坏死因子