2011-12-16 1 views
7

리플렉션을 사용하여 내부 보호 클래스를 인스턴스화 할 수있는 이유는 무엇입니까? 패키지 수준 보호가있는 내부 클래스는 아닌 이유는 무엇입니까? 나는 어느 쪽도 포장의 바깥쪽에 접근 할 수있을 것이다라고 생각하지 않을 것이다. 두 클래스가 서로 다른 패키지에 있는지Java 리플렉션으로 패키지 보호 대 보호

package dummy; 

public class ClassContainer { 
    protected static class InnerProtected { 
     public InnerProtected() {} 
    } 

    static class InnerDefault { 
     public InnerDefault() {} 
    } 

    private class InnerPrivate { 
     public InnerPrivate() {} 
    } 
} 


package driver; 

public class DriverClass { 

    public static void main(String[] args) throws Exception { 
     Class.forName("dummy.ClassContainer$InnerProtected").newInstance(); 
     Class.forName("dummy.ClassContainer$InnerDefault").newInstance(); 
     Class.forName("dummy.ClassContainer$InnerPrivate").newInstance(); 
    } 
} 

주의 사항 :

는 다음과 같은 예를 생각해 보자.

메인의 첫 번째 줄 (InnerProtected를 인스턴스화 함)이 작동합니다.

(InnerDefault 인스턴스화) 번째 행이 예외가 발생 일 : 클래스 정의는 상이한 패키지 드라이버 때문에

Exception in thread "main" java.lang.IllegalAccessException: Class driver.DriverClass can not access a member of class dummy.ClassContainer$InnerDefault with modifiers "public" 

인,해서는 안 클래스 실패 인스턴스 모두에서 시도?

(무엇이 가치 : 내가 기대하는 것처럼 InnerPrivate 실패의 인스턴스를 시도하는.

Exception in thread "main" java.lang.InstantiationException: dummy.ClassContainer$InnerPrivate 
+0

흥미로운 질문입니다. 이 냄새는 자바 버그 나 정말 밀교적인 디자인 결정처럼 느껴집니다. – Nayuki

답변

4

정말, javap 보고서 InnerProtectedpublic로 컴파일되어, 다른 멤버 클래스 패키지 개인 반면

다른 패키지의 하위 클래스 ClassContainer에서 볼 수있게해야 할 필요가 있다고 생각합니다.이 경우 VM은 액세스 제어 규칙을 처리 할 수 ​​없으므로 컴파일러 수준에서 처리됩니다.

그러나 이러한 클래스에 대한 constuctor 선언을 생략하면 생성 된 생성자의 예상 visililities가 각각 protected이고 기본값은 private입니다.

+1

예, JDK 1.00에는'protected' 클래스가 없으므로 클래스 파일도 없습니다. 동일한 패키지에서 사적인 클래스와 로컬 내부 클래스에 액세스 할 수 있어야합니다. –