问题标签 [bytecode-manipulation]

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 投票
4 回答
2412 浏览

classloader - 修改字节码使方法返回true

我有类文件有这样的方法:

这个验证方法中有很多代码,但我只想让它总是返回真或假。有人可以指出如何修改类文件来实现这一点吗?

0 投票
1 回答
1837 浏览

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

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

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

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

0 投票
4 回答
258 浏览

java - 执行一段字节码

想想这个示例代码:

假设运行代码并在 try 块内引发异常。执行流程进入 catch 块。

在这里,我想复制 try 块的字节码(可能使用 ASM),对字节码进行一些修改(例如用 stm4 替换 stm2)并在 catch 块中执行新的字节码。

这是否可能不编译或加载新的字节码,而只是像解释语言一样执行它?

谢谢!

更新

我知道我可以先验地编写正确的代码。问题不是为什么,而是如何做到这一点以及是否可能。

假设我必须动态计算新的 try 主体,并且我必须在同一个对象中执行新代码(因为局部变量和类变量。)

0 投票
2 回答
1281 浏览

java - 艾玛是如何工作的?

为了使用 Emma,我们将首先使用 Emma 检测 jar。在此期间,将生成 em 元数据文件,并且当您在已检测的 jar 上运行 JUnit 测试用例时,将生成 ec 文件。用于生成覆盖率报告。

我的问题是我们在运行测试用例时没有指定 em 文件的路径,那么它如何生成 ec 文件?我也听说 Emma 在运行时使用端口。那个端口是什么?

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 投票
2 回答
1497 浏览

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

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

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

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

0 投票
3 回答
2931 浏览

java - 本机 Java 字节码检测

对于 java 中的字节码检测,有 asm 框架以及 bcel 和 javaassist 库。

但是我需要在本机代码中进行检测,因为在 javaagent 运行时已经加载了一些 java 类,例如 java.lang.Thread、java.lang.Class 等

是否有任何用于在本机代码中检测 java 类的库?

编辑:似乎有一点混乱。

我想要的是:创建一个本地 java 代理,它使用 JVMTI apis 在加载类时使用 OnClassLoad 事件挂钩来更改类的字节码。

0 投票
1 回答
215 浏览

reflection - 使用 Javassist 创建新类型

输出是:

getMom setMom java.lang.NoSuchMethodException: PPerson.getMom(main.Person) at java.lang.Class.getDeclaredMethod(Unknown Source) at main.Main.main(Main.java:69)

为什么它第二次看不到“getMom”字段?

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 投票
3 回答
8784 浏览

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

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

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