Вы можете использовать AspectJ с ткачеством во время загрузки (javaagent). Вы можете, например, записывать аспекты для отслеживания вызовов конструктора (точки вызова / выполнения) и контролировать доступ к полю (установить / получить точки).
Я использую разработку на основе аннотаций. Например, чтобы контролировать установку всех нестатических нефинальных и нетранзитивных полей во всех классах в данном пакете, вы можете создать аспект:
@Aspect
public class MonitorAspect {
@Around(" set(!static !final !transient * (*) . *) && args(newVal) && target(t) && within(your.target.package.*) ")
public void aroundSetField(ProceedingJoinPoint jp, Object t, Object newVal) throws Throwable{
Signature signature = jp.getSignature();
String fieldName = signature.getName();
Field field = t.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object oldVal = field.get(t);
System.out.println("Before set field. "
+ "oldVal=" + oldVal + " newVal=" + newVal + " target.class=" + t.getClass());
jp.proceed();
}
}
в META-INF месте aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="your.package.MonitorAspect" />
</aspects>
</aspectj>
Поместите acpectjrt.jar и aspectjweaver.jar в classpath и запустите JVM с параметром -javaagent:lib/aspectjweaver.jar
.
Вот несколько примеров и документации http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html