通過反射獲取私有內部類物件
阿新 • • 發佈:2018-12-26
首先是我們的目標物件:
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