修改字节码的特定部分

时间:2013-03-30 20:00:30

标签: java bytecode bytecode-manipulation

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

我的意思是我知道什么类,什么方法(或字段),以及我想要修改的行号,但我想知道如何在特定行修改字节码/班级的领域。

说我有一个班级, 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行(我们现在将忽略包),并且检查100以上必须在第9行,移动方法的部分进行设置向下1行。

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

2 个答案:

答案 0 :(得分:2)

AspectJ(或任何AOP库)可能在这里有用。它允许您定义切入点,例如在调用特定方法时(或者在其他事物中定义字段时)。然后,您可以应用建议,这是您在加入点之前/之后所做的事情(连接点是应用切入点的地方)。

例如,

应用建议,验证伽玛值<&lt; 100每当调用该方法时。如果该值无效,则抛出异常。如果有效,请继续正常。

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

答案 1 :(得分:1)

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

这非常重要,但ASM人员提供了一些非常详细的文档。快乐的黑客攻击。

相关问题