Como posso usar java.lang.instrument em um aplicativo Eclipse RCP?
Para usar os recursos de instrumentação introduzidos no JDK 5, você pode usar o-javaagent
sinalizador passado para a JVM. Isso irá injetar uma instância de uma classe de instrumentação napremain
método. Por exemplo, em uma classe como esta:
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
Com um arquivo de manifesto apropriado, você pode executar isso da seguinte maneira:
java -javaagent:myfiles.jar SomeClass
Isso chama o método premain entãomain
deSomeClass
. Essa abordagem é usada noProjeto Java.SizeOf para adivinhar o tamanho aproximado de um objeto Java.
OK, agora no Eclipse RCPcada pacote tem seu próprio classloader. Isso significa que a Instrumentação estática que armazenamos em nosso MyClass não é visível para um aplicativo Eclipse. O javaagent usa um carregador de classes, os pacotes do Eclipse são carregados com outro. Quando nós acessamosMyClass.inst
de dentro de um plugin énull
, Comonaquela classe não é a mesma classe que o javaagent carregado e chamadopremain
em.
Outras pistas sobre uma possível solução sãoesta discussão na lista de discussão do rcp. Mas nada conclusivo.
Existe alguma maneira de contornar isso? oEclipse-BuddyPolicy
insinuado no artigo eclipsezone soa bem. Eu tentei:
Eclipse-BuddyPolicy: app
nos meus plugins sem sorte. Preciso de algo comoEclipse-BuddyPolicy: javaagent
. Alguma ideia?