¿Cómo puedo usar java.lang.instrument en una aplicación RCP de Eclipse?
Para utilizar las funciones de instrumentación introducidas en JDK 5, puede usar la-javaagent
Bandera pasada a la JVM. Esto inyectará una instancia de una clase de Instrumentación en la estáticapremain
método. Por ejemplo, en una clase como esta:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
Con un archivo de manifiesto adecuado, puede ejecutar esto de la siguiente manera:
java -javaagent:myfiles.jar SomeClass
Esto llama entonces al método principalmain
desdeSomeClass
. Este enfoque se utiliza en elProyecto Java.SizeOf para adivinar el tamaño aproximado de un objeto Java.
OK, ahora en Eclipse RCPcada paquete tiene su propio cargador de clases. Esto significa que la Instrumentación estática que almacenamos en nuestra MyClass no es visible para una aplicación Eclipse. El javaagent usa un cargador de clases, los paquetes de Eclipse se cargan con otro. Cuando accedemosMyClass.inst
desde dentro de un plugin esnull
, comoese clase no es la misma clase que la que javaagent cargó y llamópremain
en.
Otras pistas sobre una posible solución son:este hilo en la lista de correo rcp. Pero nada concluyente.
¿Hay alguna manera de evitar esto? losEclipse-BuddyPolicy
insinuado en el artículo eclipsezone suena bien. Lo intenté:
Eclipse-BuddyPolicy: app
En mis plugins sin suerte. Necesito algo comoEclipse-BuddyPolicy: javaagent
. ¿Algunas ideas?