Java 反射內(nèi)部類

問:如下代碼段,已獲取外部類實例情況下,如何反射實例化內(nèi)部類及調(diào)用內(nèi)部類方法?
class OuterClass {
    public void func(){
        System.out.println("Outer class.");
    }
    class InnerClass {
        private String mName;
        public InnerClass(String name) {
            mName = name;
        }
        void getName(){
            System.out.println("name is:"+mName);
        }
    }
}

答:答案完整代碼如下:

class OuterClass {
    public void func() {
        System.out.println("Outer class.");
    }
    class InnerClass {
        private String mName;
        public InnerClass(String name) {
            mName = name;
        }
        void getName() {
            System.out.println("name is:"+mName);
        }
    }
}

public class Demo {
    public static void main(String[] args) throws Exception {
        Class outerClass = Class.forName("OuterClass");
        //通過外部類的方法名獲取外部類的方法
        Method method = outerClass.getDeclaredMethod("func");
        //調(diào)用外部類實例的func方法,invoke第一參數(shù)為外部類實例
        method.invoke(outerClass.newInstance());

        //內(nèi)部類反射名字需要使用$分隔,編譯后生成的規(guī)則
        Class innerClass = Class.forName("OuterClass$InnerClass");
        //通過內(nèi)部類的方法名獲取內(nèi)部類的方法
        Method method2 = innerClass.getDeclaredMethod("getName");
        //特別注意!內(nèi)部類newInstance的第一個參數(shù)必須是外部類實例的引用
        method2.invoke(innerClass.getDeclaredConstructors()[0].newInstance(outerClass.newInstance(),"yan"));
    }
}

即便上面 InnerClass 的修飾符是 private,上面的代碼依舊可以成功反射,只是不能直接通過

outClass.new InnerClass("yan"); 

的方式去實例化內(nèi)部類。

但是,當上面 InnerClass 的修飾符如果是 static,即內(nèi)部類是靜態(tài)內(nèi)部類時,上面的代碼就不能用了,需要將答案的最后一行代碼改成

method2.invoke(innerClass.getDeclaredConstructors()[0].newInstance("yan")); 

才行,因為靜態(tài)內(nèi)部類沒有持有外部類的任何引用,所以不用傳遞外部類實例對象的引用。

問:如何反射如下類的匿名內(nèi)部成員類?
class OuterClass {
    public Runnable runnable = new Runnable() {
        public void run() {
            System.out.println("runnable.");
        }
    };
}

答:這種場景你就不要把它想成匿名內(nèi)部類了,直接當作外部類的成員變量去反射即可,如下。

class OuterClass {
    public Runnable runnable = new Runnable() {
        public void run() {
            System.out.println("runnable.");
        }
    };
}

public class Demo {
    public static void main(String[] args) throws Exception {
        Class outerClass = Class.forName("OuterClass");
        Runnable runnable = (Runnable) (outerClass.getField("runnable").get(outerClass.newInstance()));
        runnable.run();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問:Java 常見的內(nèi)部類有哪幾種,簡單說說其特征? 答:靜態(tài)內(nèi)部類、成員內(nèi)部類、方法內(nèi)部類(局部內(nèi)部類)、匿名內(nèi)...
    Little丶Jerry閱讀 2,231評論 0 1
  • 這個系列是幫助復(fù)習(xí) Java 的基礎(chǔ)知識的,但是并不會按照一個特定的順序。現(xiàn)在開始復(fù)習(xí)下內(nèi)部類的相關(guān)知識。 0. ...
    一團撈面閱讀 740評論 0 0
  • 作者:心隨云動 每一次撥通了你的電話號碼, 想要對你說的千言萬語, 可是話到嘴邊, 卻都化做了那一句, 我想你了!...
    心隨云動閱讀 1,254評論 0 0
  • 她很努力,六點起床,去背單詞,晚上不到臨晨宿舍很少見到她,手機里鬧鐘從來都是好多個,設(shè)置為“每天”,從大一開始各種...
    昨夜西風(fēng)烈閱讀 295評論 0 1

友情鏈接更多精彩內(nèi)容