如何修改字节码的特定部分以添加内容?
我的意思是我知道什么类,什么方法(或字段),以及我想要修改的行号,但我想知道如何在特定行修改字节码/班级的领域。
说我有一个班级, 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>
答案 0 :(得分:2)
AspectJ(或任何AOP库)可能在这里有用。它允许您定义切入点,例如在调用特定方法时(或者在其他事物中定义字段时)。然后,您可以应用建议,这是您在加入点之前/之后所做的事情(连接点是应用切入点的地方)。
例如,
应用建议,验证伽玛值<&lt; 100每当调用该方法时。如果该值无效,则抛出异常。如果有效,请继续正常。
如果您真的想修改不属于切入点类别的各个代码行,可以使用@DavidTitarenco建议的ASM库
答案 1 :(得分:1)