gpt4 book ai didi

Javassist 检测字段访问

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:27 24 4
gpt4 key购买 nike

有谁知道是否有任何方法可以使用 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 类将所有读取访问替换为 System.out.println(...);XXX=o.field,将所有写入访问替换为 System.out.println(...);o.field=XXX

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

提前致谢!

最佳答案

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

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

我希望你明白;)

关于Javassist 检测字段访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33832037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com