Javassist工具字段访问

时间:2015-11-20 16:55:01

标签: java field javassist

有没有人知道是否有办法拦截使用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

的所有写访问

我想要做的是将常规类实例转换为代理,以便任何字段访问都会触发方法执行。这可行吗?它对可能的子类有什么影响吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

一种方法是将所有代理的字段设为私有,当然还提供相应的setter / getter,之后,你将实现一个MethodHandler,它将包含你想要执行的方法(即调用)和你需要修改一个MethodFilter,在其中你将指定要拦截的方法(在你的情况下是getter / setters)

我认为你已经熟悉了javassist,所以我认为不需要代码示例,否则,我可以编辑这篇文章来提供示例

我希望你明白这一点;)