如何修改字节码的特定部分来添加东西?
我的意思是,我知道要修改哪个类、哪个方法(或字段)和哪个行号,但我想知道如何在类的特定行/字段处修改字节码。
假设我有一个类 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人员提供了一些非常详细的文档。快乐的黑客。