gpt4 book ai didi

java - 如何在 Eclipse RCP 应用程序中使用 java.lang.instrument?

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:21 27 4
gpt4 key购买 nike

为了使用 JDK 5 中引入的检测功能,您可以使用传递给 JVM 的 -javaagent 标志。这会将 Instrumentation 类的实例注入(inject)到静态 premain 方法中。例如在这样的类中:

public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}

使用适当的 list 文件,您可以按如下方式运行:

 java -javaagent:myfiles.jar SomeClass

这会调用 SomeClass 中的 premain 方法,然后调用 mainJava.SizeOf Project 中使用了这种方法猜测 Java 对象的大致大小。

好的,现在在 Eclipse RCP 中 each bundle has its own classloader .这意味着我们存储在 MyClass 中的静态 Instrumentation 对 Eclipse 应用程序不可见。 javaagent 使用一个类加载器,Eclipse 包使用另一个加载。当我们从插件中访问 MyClass.inst 时,它是 null,因为 that 类与 javaagent 加载的类不同,并且调用了 premain

关于可能解决方案的其他线索是 this thread在 rcp 邮件列表上。但没有定论。

有什么办法可以解决这个问题吗? eclipsezone 文章中暗示的 Eclipse-BuddyPolicy 听起来不错。我试过:

Eclipse-BuddyPolicy: app

在我的插件中没有运气。我需要像 Eclipse-BuddyPolicy: javaagent 这样的东西。有什么想法吗?

最佳答案

我认为最简单的解决方案是使用全局属性对象。让 pre-main 将检测对象存储为全局属性,然后从任何地方访问它(属性对象在所有类加载器中都是相同的):

[编辑:更新]

public class MyClass {
private static final String KEY = "my.instrumentation";
public static void premain(String options, Instrumentation inst) {
Properties props = System.getProperties();
if(props.get(KEY) == null)
props.put(KEY, inst);
}

public static Instrumentation getInstrumentation() {
return System.getProperties().get(KEY);
}
}

关于java - 如何在 Eclipse RCP 应用程序中使用 java.lang.instrument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2063829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com