2013-04-30 2 views
0

패키지 안에 중첩 공공 정적 클래스의 접근성 나는 두 개의 패키지가 있습니다 package1 클래스 A (public으로 선언 NOT)과 중첩 정적 클래스 B을 포함 (public으로 선언) :반사 - 지역 클래스 내 예에서

package package1;  
class A { 
    public static class B { 
     public B() { 
     } 
    } 
    public A() { 
    }  
} 

package2는 반 성적 클래스 package1.A$B의 인스턴스를 만들려고 간단한 주요 방법으로 Main 클래스를 포함 :

package package2;  
public class Main {  
    public static void main(String[] args) { 
     try { 
      Class<?> innerClass = Class.forName("package1.A$B"); 
      Object o = innerClass.newInstance(); 
      System.out.println(o); 
     } catch (ReflectiveOperationException e) { 
      e.printStackTrace(); 
     } 
    }  
} 

Surprisin gly (적어도 나를 위해), 코드 의이 조각은 반사 없이는 불가능한 일을 성공합니다. 클래식 import 문 (예 : import package1.A.B; 또는 import package1.A.*;)은 클래스 A이 보이지 않는다는 오류를 발생시킵니다. 또한 B의 인스턴스를 만들 때 특수 액세스 권한이 필요하지 않습니다. 정상적인 행동입니까?

편집 : 나는 다른 방법으로 내부 클래스에 대한 참조를 얻을 경우이 같은도 작동합니다

Class<?> innerClass = Class.forName("package1.A").getClasses()[0]; 
+0

비공개'A' 클래스는 어떻게 만들 수 있습니까? 다른 공용 클래스의 일부입니까? – sanbhat

+0

"공개적이지 않다"는 말은 기본 (패키지) 가시성을 의미합니다. – maurizeio

답변

0

예, 이것은 절대적으로 괜찮습니다. package.classname$innerclass과 같이 작성하면 정적 innerclass를 얻을 수 있습니다.

+0

괜찮 았지만이 경우 구조에서'java.lang.IllegalAccessException'을 기대했습니다. – maurizeio

+0

응용 프로그램이 (인스턴스가 아닌) 배열을 생성하거나, 인스턴스를 설정하거나 가져 오거나, 메소드를 호출하려고 할 때 IllegalAccessException이 throw됩니다 현재 실행중인 메서드는 지정된 클래스, 필드, 메서드 또는 생성자의 정의에 액세스 할 수 없습니다. 클래스 B는 public이고 static이며 쉽게 액세스 할 수 있습니다. –

+0

괜찮지 만 클래스 B가 공개되어 있기 때문에 클래스 B에 액세스하는 것이 합당한 경우 'package1.A.B'클래스를 직접 가져올 수없는 이유는 무엇입니까? – maurizeio