1. 程式人生 > >通過反射獲取私有內部類物件

通過反射獲取私有內部類物件

首先是我們的目標物件:

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