修改字节码的特定部分



如何修改字节码的特定部分来添加东西?

我的意思是,我知道要修改哪个类、哪个方法(或字段)和哪个行号,但我想知道如何在类的特定行/字段处修改字节码。

假设我有一个类 gammaccontroller

public class GammaController {
    private int gamma = 60;
    public int getScreenGamma() {
        return gamma;
    }
    public void setScreenGamma(int gamma) {
        this.gamma = gamma;
    }
}

但是我想改变gammaccontroller . setscreengamma()不允许超过100的值,而不编辑文件。我知道该方法位于第8行(我们现在将忽略包),并且必须在第9行检查是否超过100,将方法中进行设置的部分移动1行。

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

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

应用建议,验证伽马值为<100,每当调用该方法时。如果该值无效,则抛出异常。如果有效,继续正常运行。

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

所建议的那样

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

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

最新更新