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++;
请记住,这是唯一可能的,因为您要计算的字段是实例而不是静态字段。
我正在尝试使用 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++;
请记住,这是唯一可能的,因为您要计算的字段是实例而不是静态字段。