Как узнать, к какому экземпляру объекта относится поле в javassist? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь разработать приложение, используя 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()));
                }
            });
        }

И моя проблема во втором условии предиката в лямбда-функции.

Вывод, который я ищу: Всего прочтений: 2 Всего записей: 1 , но я либо не получаю записи, либо 3 записи, и обе опции неверны в моей проблеме.

1 Ответ

1 голос
/ 24 марта 2019

Вы знаете только, к какому экземпляру объекта относится поле во время выполнения.Вам нужно ввести код, который подтверждает это.Одно из возможных решений - ввести этот код

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

Помните, что это возможно только потому, что поле, которое вы хотите считать, является экземпляром, а не статическим полем.

...