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

问题描述 投票:0回答:1

我正在尝试使用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次写入,并且我的问题中的两个选项都是错误的。

java javassist
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.