首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建jvmti代理以查看所有已加载的类、对象及其字段详细信息

如何创建jvmti代理以查看所有已加载的类、对象及其字段详细信息
EN

Stack Overflow用户
提问于 2011-07-25 11:39:46
回答 1查看 1.1K关注 0票数 2

我想写一个java代理来插装一些应用程序。我感兴趣的是获取由应用程序实例化的对象的详细信息(即它们的字段)。我还希望在运行时捕获对这些对象/其字段的任何读写访问。

您能否指导我编写代理,并让我知道我应该探索哪些类和方法。我只知道java.lang.instrument类。但我在那里找不到任何可以捕捉这些事件的东西。

我也对您认为可以帮助我的任何其他java插装技术持开放态度。

EN

回答 1

Stack Overflow用户

发布于 2011-07-25 14:55:53

您可以将AspectJ与加载时编织(javaagent)一起使用。例如,您可以编写方面来监控构造函数调用(调用/执行切入点)和监控字段访问(设置/获取切入点)。

我使用的是基于注释的开发。例如,要监视给定包中所有类中的所有非静态、非最终和非瞬态字段的设置,您可以创建aspect:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
<?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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6811579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档