代码之家  ›  专栏  ›  技术社区  ›  richq luc

如何在EclipseRCP应用程序中使用java.lang.instrument?

  •  5
  • richq luc  · 技术社区  · 15 年前

    为了使用JDK5中引入的工具特性,可以使用 -javaagent 传递给JVM的标志。这将向静态 premain 方法。例如,在这样的类中:

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

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

     java -javaagent:myfiles.jar SomeClass
    

    这将调用Premain方法,然后 main SomeClass . 此方法用于 Java.SizeOf Project 猜测Java对象的大致大小。

    好了,现在在EclipseRCP中 each bundle has its own classloader . 这意味着我们存储在MyClass中的静态工具对于Eclipse应用程序是不可见的。javaagent使用一个类加载器,Eclipse包与另一个类加载器一起加载。当我们进入 MyClass.inst 从插件内部 null 作为 那个 类与JavaAgent加载和调用的类不同 普雷曼 在。

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

    有办法解决这个问题吗?这个 Eclipse-BuddyPolicy 在《黄道带》一文中暗示的话听起来不错。我尝试过:

    Eclipse-BuddyPolicy: app
    

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

    1 回复  |  直到 13 年前
        1
  •  4
  •   Itay Maman    13 年前

    我认为最简单的解决方案是使用全局属性对象。让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);
        }
    }