为了使用JDK 5中引入的仪器化功能,您可以使用传递给JVM的-javaagent标志。这将在静态premain方法中注入一个Instrumentation类的实例。例如,在像这样的类中:
这将调用
现在,在Eclipse RCP中,每个bundle都有自己的类加载器。这意味着我们存储在MyClass中的静态Instrumentation对于Eclipse应用程序是不可见的。javaagent使用一个类加载器,Eclipse bundles使用另一个类加载器。当我们从插件内部访问
关于可能解决方案的其他线索,请参考rcp邮件列表上的此线程。但没有什么确定的结论。
有没有办法绕过这个问题?在eclipsezone文章中提到的
在我的插件中没有成功。我需要类似
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
通过适当的清单文件,您可以按如下方式运行它:
java -javaagent:myfiles.jar SomeClass
这将调用
SomeClass
的premain
方法,然后调用main
方法。在Java.SizeOf项目中使用这种方法来猜测一个Java对象的大致大小。现在,在Eclipse RCP中,每个bundle都有自己的类加载器。这意味着我们存储在MyClass中的静态Instrumentation对于Eclipse应用程序是不可见的。javaagent使用一个类加载器,Eclipse bundles使用另一个类加载器。当我们从插件内部访问
MyClass.inst
时,它是null
,因为那个类不是javaagent加载并调用premain
的那个类。关于可能解决方案的其他线索,请参考rcp邮件列表上的此线程。但没有什么确定的结论。
有没有办法绕过这个问题?在eclipsezone文章中提到的
Eclipse-BuddyPolicy
听起来不错。我尝试了:Eclipse-BuddyPolicy: app
在我的插件中没有成功。我需要类似
Eclipse-BuddyPolicy: javaagent
的东西。有什么建议吗?