字节码操作拦截设置字段的值

时间:2010-11-16 19:31:29

标签: java bytecode-manipulation java-bytecode-asm

使用像ASMcglib之类的库,有没有办法在每次设置类字段的值时将字节码指令添加到类中以执行代码?

例如,假设我有这个课程:


   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类中的属性?

2 个答案:

答案 0 :(得分:4)

有两个字节码可用于更新字段:putfieldputstatic(请参阅http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc11.html)。这些将在using类的代码中找到,因此无法简单地修改Person

答案 1 :(得分:0)

简而言之,您需要在感兴趣的方法中注入执行以下操作的字节码:

if (person.name.equals("Joe") { 
   dirty = true;
}

您无法在检测时评估该字段 - 它必须在执行该方法时处于运行时。

关于您的问题,请尝试以下方法:

  • 将代码写入测试类并生成字节码的ascii版本以查看生成的内容。您可以使用javap轻松完成此操作。