java反射 获取参数类型_Java反射带参构造创建对象时如何自动转换参数类型
需求是這樣的:有一個(gè)類,類的路徑知道,例如是com.xx.xx.xx其中有不同類型的成員變量(個(gè)數(shù)未知),有對(duì)應(yīng)的setter和getter方法,有一個(gè)無(wú)參構(gòu)造和一個(gè)全參構(gòu)造。現(xiàn)在需要用反射機(jī)制...
需求是這樣的:
有一個(gè)類,類的路徑知道,例如是com.xx.xx.xx 其中有不同類型的成員變量(個(gè)數(shù)未知),有對(duì)應(yīng)的setter和getter方法,有一個(gè)無(wú)參構(gòu)造和一個(gè)全參構(gòu)造。現(xiàn)在需要用反射機(jī)制來(lái)獲得一個(gè)對(duì)象,該對(duì)象中的成員變量有各自的值。
我做了一下,發(fā)現(xiàn)通過(guò)Class.forName("com.xx.xx.xx")得到對(duì)應(yīng)的class對(duì)象后,調(diào)用class對(duì)象的getConstructors()方法得到所有構(gòu)造,然后判斷出有參構(gòu)造。
再利用getConstructor(parameterTypes).newInstance(initargs)的方式進(jìn)行對(duì)象獲取時(shí),參數(shù)的值和參數(shù)類型無(wú)法自動(dòng)匹配。如何解決這個(gè)問(wèn)題?
這是我自己試著寫的代碼:
public static Object test() throws InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
Class> c = Class.forName("com.xx.xx.xx");
//得到所有構(gòu)造
Constructor>[] consts = c.getConstructors();
//定義有參構(gòu)造
Constructor> consts1 = null;
for (int i = 0; i < consts.length; i++) {
int paramsLength = consts[i].getParameterAnnotations().length;
if (paramsLength > 0) {
//判斷參數(shù)長(zhǎng)度取得有參構(gòu)造
consts1 = consts[i];
}
}
//得到有參構(gòu)造參數(shù)類型
Class>[] type = consts1.getParameterTypes();
//實(shí)驗(yàn)性數(shù)據(jù)
String str1 = "1";
String str2 = "test";
String str3 = "test";
Object[] values = { str1, str2, str3 };
//得到對(duì)象
Object obj = c.getConstructor(type).newInstance(values[0],values[1],values[2]);
return obj;
}
測(cè)試了一下,報(bào)異常:
java.lang.IllegalArgumentException: argument type mismatch
異常拋出的地方是:
Object obj = c.getConstructor(type).newInstance(values[0],values[1],values[2]);
展開(kāi)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java反射 获取参数类型_Java反射带参构造创建对象时如何自动转换参数类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 运维人员mysql如何访问_mysql
- 下一篇: 股票代码dr是什么意思