需求是這樣的:有一個類,類的路徑知道,例如是com.xx.xx.xx其中有不同類型的成員變量(個數未知),有對應的setter和getter方法,有一個無參構造和一個全參構造。現在需要用反射機制...
需求是這樣的:
有一個類,類的路徑知道,例如是com.xx.xx.xx 其中有不同類型的成員變量(個數未知),有對應的setter和getter方法,有一個無參構造和一個全參構造。現在需要用反射機制來獲得一個對象,該對象中的成員變量有各自的值。
我做了一下,發現通過Class.forName("com.xx.xx.xx")得到對應的class對象后,調用class對象的getConstructors()方法得到所有構造,然后判斷出有參構造。
再利用getConstructor(parameterTypes).newInstance(initargs)的方式進行對象獲取時,參數的值和參數類型無法自動匹配。如何解決這個問題?
這是我自己試著寫的代碼:
public static Object test() throws InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException {
Class> c = Class.forName("com.xx.xx.xx");
//得到所有構造
Constructor>[] consts = c.getConstructors();
//定義有參構造
Constructor> consts1 = null;
for (int i = 0; i < consts.length; i++) {
int paramsLength = consts[i].getParameterAnnotations().length;
if (paramsLength > 0) {
//判斷參數長度取得有參構造
consts1 = consts[i];
}
}
//得到有參構造參數類型
Class>[] type = consts1.getParameterTypes();
//實驗性數據
String str1 = "1";
String str2 = "test";
String str3 = "test";
Object[] values = { str1, str2, str3 };
//得到對象
Object obj = c.getConstructor(type).newInstance(values[0],values[1],values[2]);
return obj;
}
測試了一下,報異常:
java.lang.IllegalArgumentException: argument type mismatch
異常拋出的地方是:
Object obj = c.getConstructor(type).newInstance(values[0],values[1],values[2]);
展開