gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:06:18 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

关于java - javassist中如何知道某个字段属于哪个对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55317814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com