如何在javaagents

时间:2015-10-09 08:56:11

标签: java instrumentation javaagents

我一直在premain()使用addTransformer()。因为,当我使用服务器运行代理时,它会为某些类提供javassist.ClassNotFound个例外,我想用agentMain()redefineClasses()进行尝试。我经历了很多链接,但到目前为止,我无法找到一段代码,让我清楚地了解如何使用这两种方法设置一个简单的java代理。一些帮助将非常感激。

我们可以redefineClasses()使用premain()吗? (当我们使用redefineClasses()时,我们仍然需要transform方法吗?)

我正在尝试设置一组类的方法,其中我知道这些类的完全限定名称为com.test.Foo。我想在不经过加载到JVM上的整个类集的情况下对它们进行检测。我一直在来回阅读这些文档,但我仍然无法清楚知道如何使用redefineClasses方法?

1 个答案:

答案 0 :(得分:2)

您可以从任何地方调用redefineClasses,也可以从premain方法调用main,该方法只是instrumentation.redefineClasses(new ClassDefinition(Foo.class, new byte[] {...})); 方法之前的同一JVM进程运行的普通Java程序的扩展。

运行重新定义的一个简单示例是:

Foo

这样,Foo设置为由必须包含Foo.class的有效类文件的字节数组表示,其中字段和方法的所有签名都相同由加载的Foo加载。您可以使用ASM等工具来检测课程。

如果你真的只想要ClassFileTransformer,那么这可能只是一种方法而不是使用Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone r = RingtoneManager.getRingtone(context.getApplicationContext(), notification); r.play();