代码之家  ›  专栏  ›  技术社区  ›  Tony the Pony

用于截获设置字段值的字节码操作

  •  5
  • Tony the Pony  · 技术社区  · 14 年前

    使用类似的库 ASM cglib ,是否有方法向类添加字节码指令,以便在设置类字段的值时执行代码?

    例如,假设我有这个类:

    
       public class Person
       {  
           bool dirty;
           public String name;
           public Date birthDate;
           public double salary;
       }
    

    假设一段代码包含以下行:

    person.name = "Joe";

    我想截取这个指令,所以 dirty 标志设置为 true . 我知道这是可能的设置方法-- person.setName (“Joe”) --因为类方法可以通过字节码操作进行修改,但是我想为 领域 .

    这可能吗,如果可能的话, 怎样 ?

    编辑

    我想避免修改访问类的代码部分,我正在寻找一种方法,将拦截代码作为 Person 类。是否有字段访问的伪方法,类似于Python类中的属性?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Anon    14 年前

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

        2
  •  0
  •   Amir Afghani    13 年前

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

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

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

    关于如何解决的问题,请尝试以下操作:

    • 在测试类中编写代码并生成字节码的ASCII版本,以查看生成了什么。你可以用 javap .