[英]Bytecode manipulation to intercept setting the value of a field
使用像ASM
或cglib
这样的库,有没有办法将字节码指令添加到类中,以便在设置类字段的值时执行代码?
例如,假设我有这个类:
public class Person
{
bool dirty;
public String name;
public Date birthDate;
public double salary;
}
假设一段代码包含以下行:
person.name = "Joe";
我希望拦截此指令,以便将dirty
标志设置为true
。 我知道这对于setter方法是可行的 - person.setName (“Joe”)
- 因为类方法可以通过字节码操作来修改,但我想对一个字段做同样的事情。
这是可能的,如果是的话, 怎么样 ?
编辑
我想避免修改访问类的代码部分,我正在寻找一种方法来将拦截代码作为Person
类的一部分。 是否存在用于字段访问的伪方法,类似于Python类中的属性?
更新字段有两个字节码: putfield
和putstatic
(请参阅http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc11.html )。 这些将在using类的代码中找到,因此无法简单地修改Person
。
简而言之,您需要在感兴趣的方法中注入执行以下操作的字节码:
if (person.name.equals("Joe") {
dirty = true;
}
您无法在检测时评估该字段 - 它必须在执行该方法时处于运行时。
关于你的问题,请尝试以下方法:
javap
轻松完成此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.