当前位置: 首页 > 面试题库 >

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

莫乐
2023-03-14
问题内容

使用诸如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类中的属性?


问题答案:

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



 类似资料:
  • 我必须将注释XmlElementWrapper和XmlElement添加到列表类型的字段,但是这些注释需要名称。我想把属性名设置为字段名。我愿意: 这是我的拦截器: 这是目标类的一部分: 但我有一个例外: [public static void factory.framework.SetterListInterceptor.getter(java.lang.reflect.Method)、publ

  • 如何在构造函数拦截器中启动对象字段? 我在Buddy代码中创建了一个字节构造函数。 构造函数首先将参数保存到私有字段。然后它创建集合。然后它调用以下拦截器来填充该集合。 最好在拦截器中实例化variableNamedField字段,因为事实证明,每次创建新的类实例时,variableNamedField字段都是用相同的HashMap对象实例化的。但是,我只能通过@FieldValue注释将现有字段

  • 我想读取一个二进制文件,并对每个字节做一些操作。我想测试我是否正确地操作了字节。我想将一个字节variable1设置为“00000000”,然后将另一个字节variable2设置为“00001111”,或者它们是newvariable=variable1variable2,将newvariable<<4位,然后打印出int值。

  • 问题内容: 我正在寻找一个带有直观API的维护良好的Java字节码操作库。那里似乎有很多人。有什么建议可以尝试吗? 问题答案: 对您问题的最佳答案将取决于您的特定需求和目标;如果您可以扩展自己要完成的工作,那么我也许可以提供更针对性的答复。 取而代之的是,以我的经验,ASM可能提供了成熟度,灵活性和易用性的最佳组合: 它的开发相对活跃:即使最新版本是2009年6月,开发人员仍会定期对其VCS进行提

  • 本文向大家介绍Javassist如何操作Java 字节码,包括了Javassist如何操作Java 字节码的使用技巧和注意事项,需要的朋友参考一下 一、开篇 说起 AOP 小伙伴们肯定很熟悉,无论是 JDK 动态代理或者是 CGLIB 等,其底层都是通过操作 Java 字节码来实现代理。常用的一些操作字节码的技术有 ASM、AspectJ、Javassist 等。 ASM 其设计和实现是尽可能小而

  • 正如文件所说: 公共接口操作码 定义JVM操作码、访问标志和数组类型代码。此接口没有定义所有JVM操作码,因为某些操作码会自动处理。例如,xLOAD和xSTORE操作码会在可能的情况下自动替换为xLOAD_n和xSTORE_n操作码。因此,xLOAD_n和xSTORE_n操作码不会在此接口中定义。LDC也是如此,必要时自动替换为LDC_W或LDC2_W、WIDE、GOTO_W和JSR_W。 问题: