2013-05-20 2 views
2

com.sun.jdi는 실행중인 VM에 대한 정보를 얻을 수있는 패키지는, 스택 프레임을 보면, 중단 점을 추가 등등인스턴스의 둘러싼 인스턴스를 어떻게 얻습니까? (com.sun.jdi의)

내가 다른 인스턴스의 둘러싸는 인스턴스를 얻을 수있는 방법은? 예를 들어 Garfield.Lasagna라는 내부 클래스의 인스턴스를 4 개 생성하는 코드가 있습니다. 두 개는 Garfield의 다른 인스턴스로 묶여 있습니다.

public class Garfield { 
int belly; 
public class Lasagna { 
    Lasagna() {belly++;} 
} 
public static void main(String[] args) { 
    Garfield g1 = new Garfield(); 
    Lasagna l11 = g1.new Lasagna(); 
    Lasagna l12 = g1.new Lasagna(); 
    Garfield g2 = new Garfield(); 
    Lasagna l21 = g2.new Lasagna(); 
    Lasagna l22 = g2.new Lasagna(); 
} 
} 

내가 com.sun.jdi.ObjectReference 인스턴스를 둘러싸는 인스턴스에서 얻을 수있는 방법을 것이라고 상상하지만,이 경우 될 것 같지 않습니다.

또는 디버그 된 VM에서 반사를 사용하려고 시도합니다. java.lang.Class.getEnclosing{Class,Constructor,Method}()과 비슷하지만 개체/인스턴스에 적용되는 관련 메서드가 표시되지 않습니다.

답변

1

JDI와 리플렉션을 통해 액세스 할 수 있습니다. 둘러싼 인스턴스는 내부 클래스 Lasanga의 인스턴스 필드로 저장됩니다. 필드의 자동 생성 이름은 보통 this$0입니다 (위의 예에서이 이름의 필드는 Garfield입니다).

JDI에서 액세스하려면 ObjectReference의 ReferenceType을 사용해야합니다. three relevant methods of ReferenceType이 있습니다

  • 필드()를 모든 간단한 필드와이 합성 필드
  • visibleFields를 (제공) 추가 (당신이 필드를
  • allFields을 상속 제공) 또한 당신에게 숨겨진 필드를 제공합니다 (그리고 아마도 합성 반복 필드)

리플렉션을 통해 액세스하는 것은 평소와 동일하며 이름 필드 "this$0"을 요청하십시오.

그러나 컴파 일할 때 종합적으로 정의 된 변수에 액세스 할 수 없으면 this$0 필드에 묻는 것은 컴파일 타임 오류를 발생시킵니다.