Java 反射式访问内部类时发生异常
下面是一个用Java1.5测试的示例程序 我想知道为什么下面的两种方法有不同的结果。这是一个bug还是一种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
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;)