有没有人知道是否有办法拦截使用Javassits访问的类的字段访问?
public class Original{
public int field;
}
public class User {
Original o;
...
public int query(){
return o.field;
}
public void set(){
o.field=3;
}
}
我想要的是,每当另一个类从任何原始实例访问该字段时,它会运行一些额外的代码(例如System.out.println("Reading field");
)
我知道扩展类javassist.expr.ExprEditor并实现方法void edit(FieldAccess fa)
,我可以替换我想要的任何其他代码的字段访问,但是访问类。
这需要修改访问该字段的任何类。在我们的示例中,User类a替换System.out.println(...);XXX=o.field
的所有读访问,以及System.out.println(...);o.field=XXX
我想要做的是将常规类实例转换为代理,以便任何字段访问都会触发方法执行。这可行吗?它对可能的子类有什么影响吗?
提前致谢!
答案 0 :(得分:0)
一种方法是将所有代理的字段设为私有,当然还提供相应的setter / getter,之后,你将实现一个MethodHandler,它将包含你想要执行的方法(即调用)和你需要修改一个MethodFilter,在其中你将指定要拦截的方法(在你的情况下是getter / setters)
我认为你已经熟悉了javassist,所以我认为不需要代码示例,否则,我可以编辑这篇文章来提供示例
我希望你明白这一点;)