JDK 5에 도입 된 계측 기능을 사용하려면 -javaagent
플래그를 JVM으로 전달할 수 있습니다. Instrumentation 클래스의 인스턴스가 정적 premain
메서드에 삽입됩니다. 이 같은 클래스의 예를 들어 다음과 같이Eclipse RCP 애플리케이션에서 java.lang.instrument를 어떻게 사용할 수 있습니까?
public class MyClass {
public static Instrumentation inst;
public static void premain(String options, Instrumentation inst) {
MyClass.inst = inst;
}
}
적절한 매니페스트 파일과 함께, 당신은이를 실행할 수 있습니다
java -javaagent:myfiles.jar SomeClass
이것은 SomeClass
에서 다음 main
모두 premain 메소드를 호출합니다. 이 접근법은 Java.SizeOf Project에서 Java 객체의 대략적인 크기를 추측하는 데 사용됩니다.
이제 Eclipse RCP each bundle has its own classloader에서 OK입니다. 즉, MyClass에 저장 한 정적 Instrumentation은 Eclipse 애플리케이션에서 볼 수 없습니다. javaagent는 하나의 클래스 로더를 사용하며 Eclipse 번들은 다른 클래스 로더를로드합니다. 플러그인 내에서 MyClass.inst
에 액세스 할 때 null
이고 인 경우 클래스는 javaagent가로드 된 클래스와 같지 않으므로 premain
을 호출합니다.
가능한 해결책에 대한 다른 단서는 rcp 메일 링리스트에 this thread입니다. 그러나 결정적인 것은 없습니다.
이 문제를 해결할 방법이 있습니까? eclipsezone 기사에서 암시 된 Eclipse-BuddyPolicy
은 좋은 것 같습니다. 나는 시도했다 :
Eclipse-BuddyPolicy: app
나의 플러그 접속에서. Eclipse-BuddyPolicy: javaagent
과 같은 것이 필요합니다. 어떤 아이디어?
당신은 어떤을 받습니까 (속성은 모든 클래스 로더에서 동일 객체) 글로벌 속성으로 사전에 본점을 계측 개체가 다음 모든 곳에서 액세스 exeptions? 하나의 함정은 패키지가없는 에이전트 클래스를 가지고 있습니다. (즉, MyClass는 기본 패키지가 아닐 수 있습니다). 그것이 일식 외부에서 작동합니까? – stacker
그래, POJO 물건과 함께 Eclipse 외부에서 잘 작동한다. 사실 premain의 "println"은 Eclipse에서 표시되지만 플러그 인에서 호출되면 정적 Instrumentation은 null입니다. – richq