我想编写一个 java 代理来检测一些应用程序。我有兴趣获取应用程序实例化的对象(即它们的字段)的详细信息。我还想在运行时捕获对任何这些对象/它们的字段的任何读写访问。
您能否指导我编写代理,让我知道我应该探索哪些类和方法。我只知道 java.lang.instrument 类。但我在那里找不到任何可以捕捉这些事件的东西。
我也对您认为可以帮助我的任何其他 Java 检测技术持开放态度。
我想编写一个 java 代理来检测一些应用程序。我有兴趣获取应用程序实例化的对象(即它们的字段)的详细信息。我还想在运行时捕获对任何这些对象/它们的字段的任何读写访问。
您能否指导我编写代理,让我知道我应该探索哪些类和方法。我只知道 java.lang.instrument 类。但我在那里找不到任何可以捕捉这些事件的东西。
我也对您认为可以帮助我的任何其他 Java 检测技术持开放态度。
您可以将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 放在类路径上并使用-javaagent:lib/aspectjweaver.jar
参数运行 JVM。以下是一些示例和文档http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html