2010-05-26 48 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