5

使用类似ASMor的库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 类中的属性?

4

2 回答 2

4

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

于 2010-11-17T17:57:15.083 回答
0

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

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

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

关于您的问题,请尝试以下操作:

  • 在测试类中编写代码并生成字节码的 ascii 版本以查看生成的内容。您可以使用javap.
于 2010-11-16T19:38:31.927 回答