자바 반사 내부 클래스

2243 단어 자바C++cC#
내부 클래스 의 초기 화 는 일반 클래스 의 초기 화 와 기본적으로 같 지만 내부 클래스 의 전체 이름 은 차이 가 있 습 니 다.다음은 Outer 클래스 와 Inner 클래스 를 정의 합 니 다.
public class Outer{
   public class Inner{
   }
}

   다음 과 같은 방법 을 통 해 Inner 류 의 유형 명 을 얻 을 수 있 습 니 다.
public class Outer{
   public class Inner{
   }
   public static void main(String[] args){
      System.out.println(Inner.class);
   }
}

   출력 결 과 를 보면 Inner 의 유형 명 은 xxx. xxx. Outer $Inner 라 는 형식 입 니 다.자바 에서 말 하 는 synthetic name 입 니 다.즉, 이 이름 은 소스 코드 에서 해당 하 는 파일 을 찾 을 수 없고 컴 파일 러 가 수 정 된 이름 입 니 다.   내부 클래스 를 반사 하 는 코드 는 다음 과 같 습 니 다.
public class Outer{
   public class Inner{
   }
   public static void main(String[] args){
      System.out.println(Inner.class);
      //  class       
      System.out.println(Inner.class.getConstructors().length);
      //         
      System.out.println(Inner.class.getConstructors()[0]);
      //           
      System.out.println(Inner.class.getConstructors()[0].newInstance(new Outer());
   }
}

    위 코드 의 인쇄 출력 을 통 해 알 수 있 듯 이 비정 상 내부 류 의 기본 구조 함 수 를 공개 하려 면 외곽 류 의 인 스 턴 스 가 필요 합 니 다.    Public static 의 내부 클래스 라면 기본 구조 함 수 는 인삼 이 없 는 구조 함수 입 니 다.Inner 류 의 Public 키 워드 를 제거 하면 위의 코드 를 실행 하면 Inner 의 구조 함 수 를 찾 을 수 없 기 때문에 잘못 던 진 것 을 발견 할 수 있 습 니 다.이 럴 때 는 getConstructors 방법 을 getDeclared Constructors 로 바 꾸 면 됩 니 다.    내부 클래스 가 개인 이 라면 초기 화 할 때 구조 함수 의 접근 을 true 로 설정 해 야 합 니 다.다음 과 같다.
public class Outer{
   private class Inner{
   }
   public static void main(String[] args){
      System.out.println(Inner.class);
      //  class       
      System.out.println(Inner.class.getDeclaredConstructors().length);
      //         
      Constructor c = Inner.class.getDeclaredConstructors()[0];
      // c            
      c.setAccessible(true);
      //           
      System.out.println(c.newInstance(new Outer());
   }
}

    물론 구조 류 는 자바 의 가시 성 을 따라 야 한다. 예 를 들 어 다른 종류 에 서 는 하나의 유형의 개인 내부 류 를 초기 화 할 방법 이 없다.

좋은 웹페이지 즐겨찾기