亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

希望自定義一個函數,傳入類.class與可變參數,返回通過反射調用對應構造函數構造出的類

希望自定義一個函數,傳入類.class與可變參數,返回通過反射調用對應構造函數構造出的類

慕的地6264312 2023-04-09 10:06:08
注意:int.class不等于Integer.class 問題:因此此處調用Person p = createPerson(Person.class,3,"nilu");會找不到對應構造函數,因為它找的是傳入Integer與String的構造函數,如何解決?//junit測試函數@Testpublic void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {Person p = createPerson(Person.class,3,"nilu");p.eat();}public <T> T createPerson(Class<T> clazz, Object ...args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {final List<Class> list = new ArrayList<Class>();for(Object obj : args) {list.add(obj.getClass());}Class []_args = new Class[args.length];list.toArray(_args);list.clear();Constructor<T> constructor = clazz.getConstructor(_args);T t = constructor.newInstance(args);return t;}類:public class Person {private String name;private int age;public Person() {this.age = 18;this.name = "default name";System.out.println("Person constructor");}public Person(String name) {this.name = name;System.out.println("Person name : " + name);}public Person(int age, String name) {this.age = age;this.name = name;System.out.println("Person name : " + name);System.out.println("Person age : " + age);}}=======================================================================問題描述補充:Constructor<T> constructor = clazz.getConstructor(_args);這一行 根據_args是哪些.class 會決定得到哪個構造函數,這里實際得到的是Integer.class與String.class;然而Person(int age, String name)實際要的是int.class與String.class;這是由于調用createPerson時候,3這個int被自動裝箱了,變成了Integer,因此程序會報錯提示味找到構造函數createPerson(Integer,String)
查看完整描述

2 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

循環取參數class的時候判斷一下是否基本類型,如果是就先轉成基本類型的class?;蛘吲袛嘞逻@個類是否有個TYPE常量:


Class cls = obj.getClass();Field f = cls.getDeclaredField("TYPE");if (f != null) {    list.add((Class) f.get(null));else {    list.add(cls);}


查看完整回答
反對 回復 2023-04-11
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

參數類型不一致,自動裝箱,自動拆箱先不要考慮試試。


查看完整回答
反對 回復 2023-04-11
  • 2 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號