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

时间:2019-03-23 19:58:48

标签: java 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写入,并且这两个选项在我的问题中都是错误的。

1 个答案:

答案 0 :(得分:1)

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

if (this != $0) writeCounter++;

请记住,仅因为您要计数的字段是实例而不是静态字段,才有可能。