首先是我们的目标对象:
class Out {
//目标获取Inner对象
private class Inner {
//内部类的私有成员属性
private String inner = "ccc";
}
}
直接列出代码:
public class Main {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
//获取外部类
Class clzz = Out.class;
//获取外部类默认无参构造方法
Constructor con = clzz.getDeclaredConstructor();
//实例一个外部类对象
Out outObj = (Out) con.newInstance();
//获取外部类内的所有内部类
Class innerClazz[] = clzz.getDeclaredClasses();
//遍历
for (Class c : innerClazz) {
//获取修饰符的整数编码
int mod = c.getModifiers();
//返回整数编码对应的修饰符的字符串对象
String modifier = Modifier.toString(mod);
//找到被private修饰的内部类
if (modifier.contains("private")) {
//根据内部类的特性,需要由外部类来反射获取内部类的构造方法(这里获取的是内部类的默认构造方法)
Constructor cc = c.getDeclaredConstructor(clzz);
//由于内部类是私有的,需要强制获取构造方法的访问权限
cc.setAccessible(true);
//由外部类对象来反射获取内部类的对象
Object obj=cc.newInstance(outObj);
//获取内部类的私有成员属性inner
Field f=c.getDeclaredField("inner");
//获取访问权限
f.setAccessible(true);
//获取内部类对象obj中的私有成员属性inner的值
System.out.println(f.get(obj));
}
}
}
}
输出结果:
ccc