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

HamalAlpha發表於2018-05-10

首先是我們的目標物件:

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

相關文章