2010-05-26 18 views
1

다음은 Java 1.5에서 테스트 한 샘플 프로그램입니다.내부 클래스에 반영 할 때 예외가 발생합니다.

아래의 두 가지 접근 방식이 다른 결과를 보이는 이유가 궁금합니다. 버그인가, Java의 일종인가?

package test; 

public class TestOut { 
    public static void main(String[] args) { 
     // works 
     new TestIn(); 

     // throws IllegalAccessException 
     Class.forName("test.TestOut$TestIn").newInstance(); 
    } 

    private static class TestIn { 
    } 
} 

답변

3

클래스는, 따라서 IllegalAccessException 개인 - 당신은 사용할 수 있습니다

기록을 위해
Class cls = Class.forName(...); 
Constructor c = cls.getDeclaredConstructors()[0]; 
c.setAccessible(true); 
c.newInstance(); 

는, 예외가 확실히 설명하는 메시지를 가지고 있습니다. 다음 번에 질문에서 그러한 정보를 생략하지 마십시오. (실제로, 나는 그것을하지,이 메시지가 자바 1.5에 존재 모르겠어요?)

클래스 test.Test는 "개인"수정

와 클래스 test.TestOut $ TestIn의 멤버에 액세스 할 수 없습니다

verifyMemberAccess(..) 메서드는 sun.reflect.Reflection이며이 클래스는 클래스를 감싸는 것을 고려하지 않습니다. 멤버 (생성자)가 private 인 경우 액세스가 거부됩니다.

+1

어떻게'new'가 명시 적으로'private'에도 작동합니까? – polygenelubricants

+0

리플렉션은 컨텍스트를 제거하고 컨텍스트는 내부 클래스가 외부에 속하기 때문에 생각합니다. Class 객체 자체는 포함하는 클래스에 대한 참조를 유지하지만 생성자는 포함하지 않습니다. – Bozho

+0

3x, Bozho. "문맥"은 내가 정말로 궁금해하는 것이다. IMHO, 생성자는 클래스를 알기에 충분한 정보를 가지고 있어야하며 이런 식으로 구현해야 할 정당한 이유가없는 것 같습니다. – MikeJiang

2

Bug ID 4221909이다

시놉시스 6 고친다 이해 버그
: 클래스 내부 비 public class
상태를을 가질 때 Class.newInstance()IllegalAccess Error Exception를 슬로우 (반영) 우선 순위 : 4-Low
제출 일 : 19-Mar-1999

+0

과 아주 오래된 것 : – Bozho

관련 문제