问题标签 [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 投票
3 回答
759 浏览

java - Oracle 和 Eclipse 的编译器生成的 java 字节码的差异

我们的项目做了一些 Java 字节码检测。我们偶然发现了一些奇怪的行为。假设以下代码片段:

Oracle 的 javac 将上面的内容编译成以下字节码:

和 Eclipse 的编译器变成:

如您所见,Oracle 编译器在“new”之后生成“dup”,而 Eclipse 不会。在这个用例中这是完全正确的,因为根本不使用新创建的 Integer 实例,因此不需要“dup”。

我的问题是:

  1. 是否有一些不同编译器之间差异的概述?一篇文章/博客文章?
  2. 我可以安全地得出结论,如果“new”和“invokespecial”之间没有“dup”,那么初始化后不使用对象吗?
0 投票
1 回答
1607 浏览

java - 使用javassist获取操作数据

我正在尝试使用简单的类使用 javassist 分析字节码MyData

这是我针对此类运行的代码:

它可以工作并打印:

第 35 行调用add()名为 的集合的方法strings。我发布的代码片段仅检索invokeinterface第 35 行。好的,我可以知道它是类字段 ( getfield)。

我想知道如何获取其余信息:

  • 字段名称是strings
  • 被调用的接口方法是add()

到目前为止,谷歌搜索和阅读 API 文档都没有给出任何积极的结果。

0 投票
2 回答
769 浏览

java - 使用 javassist 用字节码中的方法替换 java 运算符

我的目标

为了能够在运行时检测何时进行比较(或任何其他操作,如 *、-、/、>、<、...

这应该通过使用 Javassist 或 ow2 ASM 编辑类的字节码来实现

必须达到什么

这段代码

必须成为

GreaterThan 将返回与 '>' 完全相同的结果,但也将用于保存比较的数量 然后每次进行比较时都会通知外部类

额外说明

它必须在有手术的地方进行。所以不仅在 if 语句中。

这表示

也必须成为

您对我如何使用 Javassist 或其他库实现这一点有任何建议吗?

我想这与 IFLT、IFGT 等操作码有关

0 投票
2 回答
510 浏览

java - 提取和执行任意 Java 字节码序列

给定 Java Class A 的 .class 文件,有没有办法(例如使用 BCEL、ASM 等)提取给定的字节码序列(假设它是一个基本块),将其放在单独的位置,然后再执行那个字节码序列?

示例:源代码具有以下行 ... a += b; b += 21; . .

我只能访问字节码表示。我想提取这些字节码并将它们视为黑匣子。在 A 类的指令中,而不是源代码行 'a += b;' 我希望它指向这个外部黑盒 X,它包含适当的缺失字节码序列。我想向黑盒提供堆栈帧上的所有必要变量(例如,a、b 的当前值,也许是要在黑盒 X 中使用的方法参数......),然后,在执行字节码序列后,黑匣子会将控制权连同新更新的帧变量一起返回给原始 A 类...

感谢您的任何想法。

编辑:

正如下面所建议的,最合理的黑盒应该是存根类文件中的存根方法。那么问题就变成了,我如何最合理地从这个指令序列创建这个格式良好的存根类和方法,以及如何将控制权从原始 A 类转移到。理想情况下,这将在编译时“离线”完成时间。

0 投票
1 回答
946 浏览

bytecode-manipulation - 用于 cap 文件的字节码卡外验证器

我需要使用卡外字节码验证器验证 Java Card 程序(cap 文件)。我已经手动修改了 cap 文件中的信息,我想验证新的 cap 文件是否是好类型。

我尝试使用 com.sun.javacard.scriptgen.CAP.verifyCAP() 方法。我发送有效和无效的 cap 文件,但结果始终等于 0。

0 投票
1 回答
79 浏览

java - 通过注释/字节码编织跟踪所有权/祖先层次结构/组成员?

在 GUI 框架中,显式地跟踪父/子关系是很常见的——给定一个任意的 GUI 组件,可以向上浏览“拥有”它的组件的层次结构。

父组件不一定是实际创建其子组件的实体,这些关系通常在创建后配置。

我有一种情况,我感兴趣的是创建关系,即一个对象创建了另一个对象。

所涉及的对象属于不同的类,它们之间一般不存在继承关系等。

实际上,我创建了具有 id 的“主”对象,并且我希望由这些对象创建的所有对象(直接或以 n 度分离)都知道其特定“主”对象的 id。

[ id 实际上仅用于记录目的。]

我可以想象这样的事情:

对于 Master 对象,id 将在其构造函数中设置。任何用@InheritGroupId 标记的类在构造时都会以某种方式查找堆栈并查找第一个调用者对象,该对象要么直接通过@GroupId 注释知道其组ID,要么以与此类相同的方式确定它,即一个这也标有@InheritGroupId。

然后你将如何访问 group-id 值我不确定,在上面的代码中,我刚刚在我想访问它的地方使用了 XXX。

我说“以某种方式查找堆栈”,但据我所知,在直接的 Java 中不可能像这样检查堆栈。

也许不需要堆栈检查的替代结构是可能的。或者也许某种 AOP 字节编织方法是可能的?

目前,我将 groupId 作为显式构造函数参数传递给系统中的几乎每个对象。所有对象都必须维护一个成员变量,这对我来说似乎很遗憾,该成员变量并不是其逻辑的一部分,而是纯粹用于日志记录。

显式传递 groupId 确实具有明确指出难以在低级事物和我的“主”对象之一之间建立创建者关系的情况的优势。

如果您对如何处理我用注释或字节码编织所描述的内容有任何想法,或者您认为显式传递 group-ids 实际上是最好的方法,或者您对如何实现相同的想法有一些完全不同的想法事情,那么请告诉我。

/乔治

更新:请注意,给定主对象的所有“子”对象都不是在一个给定时间点预先创建的,也就是说,这不是简单地将 group-id 设置为某个单例然后拥有子对象的问题当它们被大量创建时,以某种方式访问​​这个单例。

0 投票
5 回答
14219 浏览

java - 更改已编译类中的字符串常量

我需要更改已部署的 Java 程序中的字符串常量,.class即已编译文件中的值。它可以重新启动,但不容易重新编译(尽管如果这个问题没有答案,这是一个不方便的选择)。这可能吗?

更新:我只是用十六进制编辑器查看了文件,看起来我可以轻松地更改那里的字符串。那会起作用吗,即不会使文件的某种签名无效吗?旧字符串和新字符串都是字母数字,如果需要,可以是相同的长度。

更新2:我修好了。因为我需要更改的特定类非常小,并且在新版本的项目中没有更改,所以我可以编译它并从那里获取新类。出于教育目的,仍然对不涉及编译的答案感兴趣。

0 投票
1 回答
596 浏览

java-bytecode-asm - 在 java 运行时添加额外的代码

我正在开发一个库,我需要在运行时向我的对象的一些方法添加额外的代码。这里有两点。首先,我想添加额外代码的程序是之前由其他人编写的,我不想编辑它。其次,我的工作非常类似于在调用方法之前添加方面。

在互联网上搜索和阅读后,我发现了许多框架,如 aspectj、ASPECTWERKZ 等,可以完成这项工作,但例如 aspectj(在 spring 上下文中使用时)的问题是它没有为您提供任何 API在运行时进行编织。我还发现有一些库,如 ASM 和 javassist 等,但它们非常通用且难以学习,而我的工作更可能是方面。

所以你有什么建议?那里有什么好的图书馆吗?我对前面提到的上述库有误吗?请帮忙!

0 投票
1 回答
5185 浏览

java - 如何使用 ASM 添加带有初始值设定项的静态最终字段?

我想使用 ASM 将静态最终字段添加到 .class 文件中,源文件是

反编译生成的类应该是这样的:

作为结论,我想使用 ASM 将 FIRST 和 SECOND 常量添加到 .class 文件中,我该怎么做?

0 投票
0 回答
265 浏览

java - 如何从 Java 类文件中删除一些操作码?

以下是一些代码行:

这是示例 Java 类文件的字节码。

我想从 java 类文件中删除第 47、50 行的操作码。

如何使用 ASM 做到这一点?