package com.prac;
public class outer {
int i = 1;
private static class staticInner{
int j = 2;
staticInner(){}
void print(){
System.out.println("in staticInner");
}
}
private class normalInner{
int k =3;
void print(){
System.out.println("in normalInner");
}
}
}
外部类,里面有一个静态内部类,非静态内部类,它们都是私有的。
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import com.prac.outer;
public class test2 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
outer ooo = new outer();
Class<?> clazz = null;
try {
clazz = Class.forName("com.prac.outer$normalInner");
System.out.println(clazz.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?> con = clazz.getDeclaredConstructor();
Object obj = con.newInstance();
}
}
有一个测试类,我想试试用反射来创建私有的内部类实例,因为内部类是权限是私有的,所以获得 Class 引用只能通过 forName (不然就可以 import 这个内部类,然后通过类名.class
来获得了)。
当 31 行,为clazz = Class.forName("com.prac.outer$normalInner")
即获得非静态内部类 Class 的引用,然后 newInstance 报错:
com.prac.outer$normalInner
Exception in thread "main" java.lang.NoSuchMethodException: com.prac.outer$normalInner.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3354)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2558)
at test2.main(test2.java:38)
看起来好像是这篇博客讲的原因: https://www.jianshu.com/p/ecda088dcc5f 即非静态内部类构造时,构造函数会隐式地加一个 this 即外部类的引用。但这种情况还有解决办法吗?
当 31 行为clazz = Class.forName("com.prac.outer$staticInner")
即获得静态内部类 Class 的引用,然后 newInstance 报错:
com.prac.outer$staticInner
Exception in thread "main" java.lang.IllegalAccessException: class test2 cannot access a member of class com.prac.outer$staticInner with modifiers ""
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:639)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:490)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at test2.main(test2.java:39)
为什么这个就直接报错,有标识符的成员类就无法访问,因为是静态内部类吗?这种情况还有解决办法吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.