Java 反射式访问内部类时发生异常

Java 反射式访问内部类时发生异常,java,reflection,Java,Reflection,下面是一个用Java1.5测试的示例程序 我想知道为什么下面的两种方法有不同的结果。这是一个bug还是一种Java特性 package test; public class TestOut { public static void main(String[] args) { // works new TestIn(); // throws IllegalAccessException Class.forName("tes

下面是一个用Java1.5测试的示例程序

我想知道为什么下面的两种方法有不同的结果。这是一个bug还是一种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 {
    }
}

该类是私有的,因此,
IllegalAccessException
-您可以使用:

Class cls = Class.forName(...);
Constructor c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
c.newInstance();
对于记录,异常有一条消息,这是非常描述性的。下次不要在问题中遗漏这些信息。(实际上,我不确定Java 1.5上是否存在此消息,是吗?)

类test.test无法访问带有修饰符“private”的类test.TestOut$TestIn的成员


问题在于
sun.reflect.Reflection
verifyMemberAccess(..)
方法,并且它没有考虑封闭类。如果成员(构造函数)是私有的,则访问被拒绝。

该类是私有的,因此,
IllegalAccessException
-您可以使用:

Class cls = Class.forName(...);
Constructor c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
c.newInstance();
对于记录,异常有一条消息,这是非常描述性的。下次不要在问题中遗漏这些信息。(实际上,我不确定Java 1.5上是否存在此消息,是吗?)

类test.test无法访问带有修饰符“private”的类test.TestOut$TestIn的成员

问题在于
sun.reflect.Reflection
verifyMemberAccess(..)
方法,并且它没有考虑封闭类。如果成员(构造函数)是私有的,则访问被拒绝。

这是:

Synopsys:(reflect)
Class.newInstance()
在类具有内部非
公共类时抛出
IllegalAccess
错误
异常

状态:6-修复已理解,错误
优先级:4-低
提交日期:1999年3月19日

这是:

Synopsys:(reflect)
Class.newInstance()
在类具有内部非
公共类时抛出
IllegalAccess
错误
异常

状态:6-修复已理解,错误
优先级:4-低
提交日期:1999年3月19日


为什么显式
new
即使是
private
也能工作呢?我认为,因为反射消除了上下文,而上下文是内部类属于外部类。类对象本身保留对封闭类的引用,但构造函数不保留。3x,Bozho。“背景”是我真正想知道的。嗯,构造函数应该有足够的信息来了解enclsong类,而且似乎没有很好的理由以这种方式实现它。@MikeJiang,@Polygene润滑剂-请参阅我的更新。问题其实在别处;)我正要提交一个bug,但是sun.com的密码重置选项中有一个bug。我报告了它,所以首先他们必须解决它,然后我才能归档真正的bug;)为什么显式
new
即使是
private
也能工作呢?我认为,因为反射消除了上下文,而上下文是内部类属于外部类。类对象本身保留对封闭类的引用,但构造函数不保留。3x,Bozho。“背景”是我真正想知道的。嗯,构造函数应该有足够的信息来了解enclsong类,而且似乎没有很好的理由以这种方式实现它。@MikeJiang,@Polygene润滑剂-请参阅我的更新。问题其实在别处;)我正要提交一个bug,但是sun.com的密码重置选项中有一个bug。我报告了它,所以首先他们必须解决它,然后我才能归档真正的bug;)