我一直在premain()
使用addTransformer()
。因为,当我使用服务器运行代理时,它会为某些类提供javassist.ClassNotFound
个例外,我想用agentMain()
和redefineClasses()
进行尝试。我经历了很多链接,但到目前为止,我无法找到一段代码,让我清楚地了解如何使用这两种方法设置一个简单的java代理。一些帮助将非常感激。
我们可以redefineClasses()
使用premain()
吗? (当我们使用redefineClasses()
时,我们仍然需要transform
方法吗?)
我正在尝试设置一组类的方法,其中我知道这些类的完全限定名称为com.test.Foo
。我想在不经过加载到JVM上的整个类集的情况下对它们进行检测。我一直在来回阅读这些文档,但我仍然无法清楚知道如何使用redefineClasses
方法?
答案 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();
。