2010-01-14 5 views
5

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과 같은 것이 필요합니다. 어떤 아이디어?

+0

당신은 어떤을 받습니까 (속성은 모든 클래스 로더에서 동일 객체) 글로벌 속성으로 사전에 본점을 계측 개체가 다음 모든 곳에서 액세스 exeptions? 하나의 함정은 패키지가없는 에이전트 클래스를 가지고 있습니다. (즉, MyClass는 기본 패키지가 아닐 수 있습니다). 그것이 일식 외부에서 작동합니까? – stacker

+0

그래, POJO 물건과 함께 Eclipse 외부에서 잘 작동한다. 사실 premain의 "println"은 Eclipse에서 표시되지만 플러그 인에서 호출되면 정적 Instrumentation은 null입니다. – richq

답변

4

가장 간단한 해결책은 전역 속성 개체를 사용하는 것입니다.

[편집 : 업데이트]

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); 
    } 
} 
+0

좋은 생각인데, 슬프게도'setProperty (String, String)'입니다. 거기에 오래된 객체를 넣을 수는 없습니다. – richq

+0

쉽게 해결할 수 있습니다 (내 대답의 업데이트 된 버전 참조) : System.getProperties() API를 제공하는 해시 테이블의 하위 클래스 인 Properties() 객체를 반환합니다. set (String, Object) 및 get (String) –

+0

그런 간단한 해결책은 완벽하게 작동합니다. 감사! – richq

관련 문제