javassist中如何知道某个字段属于哪个对象实例?

How to know to which object instance a field belongs to in javassist?

我正在尝试使用 javassist 开发一个应用程序,它应该计算对象中某个字段的写入和读取次数。然而,当一个字段被写入构造函数内部时,它不应该被计算在内,只能读取。我的问题是,如果我有一个构造函数接收一个与参数类型相同的对象,并且该对象的一个​​字段受到影响,我想计算该写入。但是我不知道如何知道该字段属于 javassist 中的哪个对象实例。例如以这个构造函数为例:

Person(Person p) {
        this.firstname = p.firstname;
        p.surname = "";
        this.surname = p.surname;
    }

我想将第一行和第三行计为读取,因为读取在构造函数中有效。但是我唯一要计算的写入是在第二行,因为它是对对象的不同实例的字段的写入。

目前我已经搜索了关于 javassist 的文档,但找不到在运行时查找某个字段属于哪个实例的方法。到目前为止我所拥有的是:

for (CtConstructor ctConstructor : ctClass.getDeclaredConstructors()) {
            ctConstructor.instrument(new ExprEditor() {
                public void edit(FieldAccess fa) throws CannotCompileException {
                    replaceFieldAccess(fa, fieldAccess -> fieldAccess.isStatic() || (fieldAccess.getClassName().equals(className) && fieldAccess.isWriter()));
                }
            });
        }

而我的问题是lambda函数中谓词的第二个条件。

我正在寻找的输出是 总读取:2 总写入:1,但我要么没有写入,要么有 3 次写入,并且这两个选项在我的问题中都是错误的.

你只知道一个字段在运行时属于哪个对象实例。您需要注入验证它的代码。一种可能的解决方案是注入此代码

if (this != [=10=]) writeCounter++;

请记住,这是唯一可能的,因为您要计算的字段是实例而不是静态字段。