需求是这样的:有一个类,类的路径知道,例如是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]);
展开