2010-05-26 40 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(); 

爲了記錄在案,除了有一個消息,這是相當描述。下次不要從這個問題中省略這些信息。 (實際上,我不知道在Java 1.5中存在此消息,是不是?)

類test.Test不能訪問類test.TestOut $ TESTIN成員與修飾語「私人」

問題在於verifyMemberAccess(..)方法sun.reflect.Reflection,並且它沒有考慮封閉類。如果成員(構造函數)是私有的,則訪問被拒絕。

+1

雖然是'private',但即使它是'private',顯示效果如何呢? – polygenelubricants 2010-05-26 05:20:36

+0

我認爲是因爲反射消除了上下文,而上下文是內部類屬於外部。 Class對象本身保留對封閉類的引用,但構造函數不包含。 Bozho 3x, – Bozho 2010-05-26 05:30:19

+0

。 「情境」是我真正想知道的。恕我直言,構造函數應該有足夠的信息來了解enclsong類,並且似乎沒有理由以這種方式實現它。 – MikeJiang 2010-05-26 05:48:40

2

這是Bug ID 4221909

Synopsys公司:(反映)Class.newInstance()拋出IllegalAccess Error Exception當類具有內非public class
狀態:6-FIX明白了,錯誤
優先:4-低
提交日期:1999年3月19日

+0

和一個非常老的:) – Bozho 2010-05-26 08:47:59