리플렉션을 사용하여 내부 보호 클래스를 인스턴스화 할 수있는 이유는 무엇입니까? 패키지 수준 보호가있는 내부 클래스는 아닌 이유는 무엇입니까? 나는 어느 쪽도 포장의 바깥쪽에 접근 할 수있을 것이다라고 생각하지 않을 것이다. 두 클래스가 서로 다른 패키지에 있는지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
흥미로운 질문입니다. 이 냄새는 자바 버그 나 정말 밀교적인 디자인 결정처럼 느껴집니다. – Nayuki