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

java - 推荐用于重写类文件以更改字段类型的字节码操作库?

我正在寻找一种从现有文件生成类文件的方法,同时允许我用另一种类型替换字段的类型。

考虑这个示例片段,我想在其中每次使用int bar...

long bar像这样:

我研究了多个字节码操作库,如 cglib、javassit 和 ASM,但它们似乎都专注于添加成员或用现有的不同方法体替换一个方法体。

有没有提供类似...的图书馆

...以一种万无一失的方式?或者我是否需要实现所有丑陋的东西,比如修复元数据和替换方法主体中的不同字节码指令,例如iload手动lload

0 投票
1 回答
594 浏览

java-bytecode-asm - 使用 ASM 字节码操作将方法中的构造函数调用包装到静态调用

我的查询与使用 ASM 的字节码操作有关。

我有一种方法如下 -

在上述方法中,我想将 SampleClass2() 构造函数更改为一个静态方法调用,该方法调用将在执行一些逻辑后返回相同的 SampleClass2 对象。所以在那之后我的方法看起来像这样。

请告诉我如何使用 ASM 字节码操作来实现这一点。我们是否需要将现有的字节码堆栈更改为相同的DUP

0 投票
2 回答
256 浏览

java-bytecode-asm - 带有 HttpURLConnection 的 ASM 字节码

使用 ASM ByteCode 库,在创建 HttpUrlConnection ic 时添加请求标头 (UUID) 下面是我的代码 - 也得到输出 === > 这是 Http CONNECT 方法!。但不知道如何添加标题?

0 投票
1 回答
733 浏览

java - 基于注解的 JMX

您将如何实现类似 Spring 的基于注释的 JMX 功能。如果类被标记的@ManagedResource类的方法标记,@ManagedOperation则通过 JMX 自动公开。

我想避免使用 MBean 表示法创建接口。我正在使用 Play with Guice 框架。首先想到的是幼稚的方法:

  • 遍历 Guice 管理的所有类
  • 如果类标有注解,则创建符合 MBean 表示法的新接口。修改类,修改后的类应该实现新创建的接口。
  • 在 MBean 服务器中注册类的实例。

第二步将使用字节码操作工具完成,例如 ASM。是否可以用 ASM 做到这一点?你将如何实现这样的功能?

0 投票
1 回答
2054 浏览

annotations - 字节码注入发生在哪里?

动机

我有一个SomeObject.java文件:

编译它会创建一个包含字节码的SomeObject.class文件。

如果我们在 JVM 上使用 SomeObject,它会被当前的类加载器加载并且一切正常。

现在让我们假设我想要一些动态代码生成。我可以编写我的自定义注释

并将其作为修饰符添加到类声明中:

我也可以在运行时保留它@Retention(RetentionPolicy.RUNTIME)

问题

用于字节码注入的注解在哪里?当使用适当的运行时保留注释加载类时,类加载器是否注入字节码,如下图所示:

0 投票
2 回答
2624 浏览

python - 在 Python 运行之前覆盖默认的 type() 元类

这里是龙。你已经被警告过了。

我正在考虑创建一个新的库来帮助编写更好的测试套件。
为了做到这一点,其中一个功能是验证正在使用的任何不是测试运行器和被测系统的对象是否具有测试替身(模拟对象、存根、假对象或虚拟对象) )。如果测试人员想要活动对象并因此减少测试隔离,则必须如此明确地指定。

我看到这样做的唯一方法是覆盖type()默认元类的内置函数。
新的默认元类将检查测试替身注册表字典以查看它是否已被测试替身替换或是否指定了活动对象。

当然,这通过 Python 本身是不可能的:

有没有办法在测试套件运行(可能是 Python)之前干预 Python 的元类查找?
也许使用字节码操作?但具体如何?

0 投票
1 回答
104 浏览

java - Java“implibs”又名没有实际代码的罐子,只包含空体的方法定义?

Windows 有“导入库”又名“imlibs”的概念 - 当您想将代码与动态库链接时,您不会将其链接到 .dll 本身,而是与包含调用 .dll 的 thunk 的特殊静态库链接. 好吧,这绝对是 Windows 的特质,但有时,这个想法并没有那么糟糕。

例如,假设您有一个由 100 个动态库组成的复杂系统,每个动态库平均为 2MB,然后是该系统的 10 个版本。因此,您为在所有版本中提供对此类系统的完整支持而发布的 SDK 将只有 2GB 的库来链接。使用仅包含符号和小的 thunk 的 implib,它会少得多。

implibs 的概念可以很容易地应用于普通的 Unixish 共享库 - 您只需转储符号,在 C 中从它们中创建简单的 thunk,编译,瞧,您可以链接到该库而不是原始库。

现在,我想将同样的想法扩展到 Java。所以,理想情况下,我会寻找一个可以接受 jar 的工具,然后在其中重写字节码类以删除方法体,只留下空(尽可能)体的方法定义。如果不存在这样的工具,我会寻找指向 Java 字节码转换框架的指针,这将使编写这样的工具变得容易。如果做不到这一点,我至少会寻找一种可以从 jar 中转储所有方法签名的工具,以遵循与本机共享库类似的方法(当然,这会更复杂,因为我不能只添加空 Java正文,而是需要返回有效类型的值)。

0 投票
2 回答
141 浏览

java - 修改字节码的特定部分

如何修改字节码的特定部分以添加内容?

我的意思是我知道什么类,什么方法(或字段),以及我想要修改的行号,但我想知道我将如何实际修改特定行/字段的字节码一类。

假设我有一堂课,GammaController

但我想更改 GammaController.setScreenGamma() 以不允许超过 100 的值,而不编辑文件。我知道该方法在第 8 行(我们现在将忽略包),并且必须在第 9 行检查是否超过 100,将方法的一部分移到第 1 行。

假设我也知道将进行检查的字节码。我想要做的是运行一个针对包含 GammaController.class 的 jar 的应用程序,并让应用程序使用检查值的字节码修改类以确保它不超过 100。我将如何去做呢?

0 投票
1 回答
7766 浏览

java - ASM 4(Java 库)教程?

我最近一直在使用 Java 库“ASM”,它用于在运行时修改字节码,以防人们不知道,而且我无法找到关于 ASM 4 的单个教程。除了官方手册ASM 4,它引用了甚至不存在的 ASM 类。

我想知道是否有人知道该库的任何教程,这些教程涵盖了基本到中间的内容,例如将一些代码插入到方法中。

0 投票
1 回答
241 浏览

java - 从外部 jarfile 中卸载的类中读取字节码

在我的 Java 应用程序中,我希望从实际未加载的类文件中读取字节码内容,在也未加载的 jar 文件中。例如,我需要能够获取任何给定的 jarfile,并在其中找到所有类,理想情况下。所以采取以下情况:

我的应用程序(这是一种库)被要求在任何路径上“检查”某个 jar,并使用我的库提供应用程序提供的各种模式以查找相似性(例如常量池相似性)。因此,我的库需要遍历类文件中的所有 jar。显然,我可以对其进行硬编码或从文件加载,但我更愿意拥有它,以便我可以通过 jar 中所有文件的字节码来匹配它们。