1

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

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

假设我有一堂课,GammaController

public class GammaController {
    private int gamma = 60;

    public int getScreenGamma() {
        return gamma;
    }

    public void setScreenGamma(int gamma) {
        this.gamma = gamma;
    }
}

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

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

4

2 回答 2

2

AspectJ(或任何 AOP 库)在这里可能会有一些用处。它允许您定义切入点,例如在调用特定方法时(或在其他情况中定义字段时)。然后您可以应用建议,这是您在连接点之前/之后执行的操作连接点是应用切入点的位置)。

例如,

每当调用该方法时,应用验证 gamma 值 < 100 的建议。如果值无效,则抛出异常。如果有效,则照常继续。

如果您真的想修改不属于切入点可以处理的类别的单独代码行,您可以使用@DavidTitarenco 建议的 ASM 库

于 2013-03-30T20:27:08.293 回答
1

您需要使用ASM 2.0或 3.0/ 4.0(取决于您的 Java 版本)。要执行我认为您想做的事情,您需要使用 aClassVisitor并修改一些值(通过VisitField等)。然后,您将需要重新加载该类。

这很重要,但 ASM 人员提供了一些非常冗长的文档。快乐的黑客。

于 2013-03-30T20:19:42.113 回答