@synapse_people

Как перехватить все операции записи на объекте при помощи модификации байт-кода?

К примеру есть метод с телом:
... obj;
obj.field0 = 10;
obj.setSomeotherfield(12);

Каким образом можно после каждой перезаписи значения или вызова сеттера вызывать еще метод, например, obj.onChanged?
То есть, сначала найти переменную необходимого типа (класса), затем найти все пишущие вызовы/установки значений, а затем затыкать после каждого вызов onChanged. P.s.obj.getSomeList().add(value) - тоже пищущая операция, можно в целом все вызовы методов заменять, а в onChanged проверять изменился ли hashCode ....
Желательно при помощи javassist, если кто знает вариант проще, напишите плиз
А также - какие могут быть проблемы при подобном подходе? Может есть вариант проще, как перехватить изменения обьекта и его под-объектов(свойств и свойств-свойств-свойствNв глубину)?
  • Вопрос задан
  • 257 просмотров
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Подобные вещи делаются с помощью AspectJ

Вот пример как перехватывать сеттеры всех классов в указаном пакете demo-aspectj

класс
package ua.evhen.aspectj.demo.domain;

public class BankAccount {

    private String pan;
    private String panSate;
    private String exDate;
    private String panName;
    private long clientId;

// getters and setter
}


аспект, который будет перехватывать вызовы методов set*
package ua.evhen.aspectj.demo.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class BankAccountAspect {
    @Before("execution(void ua.evhen.aspectj.demo.domain.*.set*(..)) && args(val)")
    public void setMethod(Object val, JoinPoint jp) {
        System.out.printf("%s := '%s'%n ", jp.getSignature().toShortString(), val);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы