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方法
結尾
歡迎關注公眾號 “新程快咖員” 解鎖更多內容!
以上就是本篇文章的全部內容啦,感謝你的閲讀和觀看。如果你覺得這篇文章有所幫助,歡迎“點贊”或分享給需要的小夥伴~