我正在尝试使用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写入,并且这两个选项在我的问题中都是错误的。
答案 0 :(得分:1)
您仅知道字段在运行时属于哪个对象实例。您需要注入验证它的代码。一种可能的解决方案是注入此代码
if (this != $0) writeCounter++;
请记住,仅因为您要计数的字段是实例而不是静态字段,才有可能。