Stories

Detail Return Return

Java通過反射獲取構造方法進行初始化實例實操分享及避坑指北 - Stories Detail

Java通過反射獲取構造方法進行初始化實例實操分享及避坑指北

插件推薦

IDEA插件MPVP(maven) 迎來2.0.x全新升級 !!!支持maven項目版本搜索(中央倉庫及私服)還能快速升級maven多模塊項目

框架開發大佬、中台開發大佬快來看~ Maven快速調整項目版本再也不用手敲命令啦,使用這款idea插件小白也能快速調整!!!

前言

作者在使用反射通過構造方法獲取實例時,遇到了點小狀況,就進行了一定的總結,一是查漏補缺並做記錄備份,二是用於簡單分享~

本文作者 “新程快咖員” ,轉載請註明出處~

注:關注公眾號後發送 “250522” 可免費領取本文涉及項目全部源碼~

Java反射中getDeclaredConstructor和getConstructor區別?

在Java反射中,getDeclaredConstructor和getConstructor都是用於獲取構造方法的方法,但有以下關鍵區別:

‌訪問範圍不同‌:

getDeclaredConstructor:可以獲取類中聲明的‌所有構造方法‌(包括private/protected/default/public)

  • 除public修飾符外,要進行獲取newInstance時必須先設置setAccessible(true);

getConstructor:只能獲取‌public修飾的構造方法

注意:

使用getDeclaredConstructor需要考慮必要性及風險,比如: 初始化是比較重的?不應被外部訪問?或者是否有專門提供獲取單例方法等?

如何通過構造方法獲取實例?

無參構造方法

  • public修飾符? 如:public MyPublicConstructorObject()

    Object targetClassInstance = targetClass.getConstructor().newInstance();

注: 也可使用getDeclaredConstructor獲取構造方法

  • private/protected/default修飾符?如:private MyPrivateConstructorObject() / protected MyProtectedConstructorObject() / MyDefaultConstructorObject()

        Constructor<?> constructor = targetClass.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object instance = constructor.newInstance();

具體可見源碼中XXXTest#testNoArgConstructor方法

單參數構造方法 (參數值為null 如何正確傳參 ?)

  • public修飾符? 如:public MyPublicConstructorObject(String str)

方式一:


    Object targetClassInstance = targetClass.getConstructor(String.class).newInstance((String) null);

方式二:


    Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(new Object[]{null});

錯誤示例:


    Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(null);

注: 也可使用getDeclaredConstructor獲取構造方法

  • private/protected/default修飾符?如:private MyPrivateConstructorObject(String str) / protected MyProtectedConstructorObject(String str) / MyDefaultConstructorObject(String str)

方式一:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance((String) null);

方式二:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(new Object[]{null});

錯誤示例:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(null);

具體可見源碼中XXXTest#testSingleArgConstructorWithNull方法

單參數構造方法 (參數值不為null 如何正確傳參 ?)

這裏其實沒什麼坑了,只要學會正確使用getConstructor和getDeclaredConstructor正常傳值即可。

  • public修飾符? 如:public MyPublicConstructorObject(String str)

方式一:


    Object targetClassInstance = targetClass.getConstructor(String.class).newInstance("aaa");

方式二:


    Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(new Object[]{"aaa"});

注: 也可使用getDeclaredConstructor獲取構造方法

  • private/protected/default修飾符?如:private MyPrivateConstructorObject(String str) / protected MyProtectedConstructorObject(String str) / MyDefaultConstructorObject(String str)

方式一:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance("aaa");

方式二:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(new Object[]{"aaa"});

具體可見源碼中XXXTest#testSingleArgConstructorWithNotNull方法

多參數構造方法 (參數值均為null 如何正確傳參 ?)

這裏其實沒什麼坑了,只要學會正確使用getConstructor和getDeclaredConstructor正常傳值即可。

  • public修飾符? 如:public MyPublicConstructorObject(String str, Integer number)

方式一:


    Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(null, null);

方式二:


    Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(new Object[]{null, null});

注: 也可使用getDeclaredConstructor獲取構造方法

  • private/protected/default修飾符?如:private MyPrivateConstructorObject(String str, Integer number) / protected MyProtectedConstructorObject(String str, Integer number) / MyDefaultConstructorObject(String str, Integer number)

方式一:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(null, null);

方式二:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(new Object[]{null, null});

具體可見源碼中XXXTest#testMoreArgConstructorWithNull方法

多參數構造方法 (參數值不均為null 如何正確傳參 ?)

這裏其實沒什麼坑了,只要學會正確使用getConstructor和getDeclaredConstructor正常傳值即可。

  • public修飾符? 如:public MyPublicConstructorObject(String str, Integer number)

方式一:


    Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance("aaa", 1);

方式二:


    Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(new Object[]{"aaa", 1);

注: 也可使用getDeclaredConstructor獲取構造方法

  • private/protected/default修飾符?如:private MyPrivateConstructorObject(String str, Integer number) / protected MyProtectedConstructorObject(String str, Integer number) / MyDefaultConstructorObject(String str, Integer number)

方式一:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance("aaa", 1);

方式二:


        Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
        constructor.setAccessible(true);
        Object instance = constructor.newInstance(new Object[]{"aaa", 1});

具體可見源碼中XXXTest#testMoreArgConstructorWithNotNull方法

結尾

歡迎關注公眾號 “新程快咖員” 解鎖更多內容!

以上就是本篇文章的全部內容啦,感謝你的閲讀和觀看。如果你覺得這篇文章有所幫助,歡迎“點贊”或分享給需要的小夥伴~

user avatar ligaai Avatar duiniwukenaihe_60e4196de52b7 Avatar cbuc Avatar renzhendezicai Avatar immerse Avatar kuaidi100api Avatar daniuge Avatar aphysia Avatar lslove Avatar shuyixiaobututou Avatar dblens_com Avatar biocrosscoder Avatar
Favorites 21 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.