Java反射带参构造创建对象时如何自动转换参数类型 50
需求是这样的:有一个类,类的路径知道,例如是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]); 展开
有一个类,类的路径知道,例如是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]); 展开
3个回答
展开全部
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflection
{
public static void main( String[] args ) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException
{
String s = "T";
Class<?> c = Class.forName(s);
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();
// 实验性数据
Object[] values = { "A", "B", "C" };
// 得到对象
Object obj = c.getConstructor(type).newInstance(values);
System.out.println(obj.getClass().getMethod("getA").invoke(obj));
System.out.println(obj.getClass().getMethod("getB").invoke(obj));
System.out.println(obj.getClass().getMethod("getC").invoke(obj));
}
}
class T
{
private String a;
private String b;
private String c;
public T()
{
System.out.println("T() was loaded...");
}
public T( String a, String b, String c )
{
System.out.println("T(String... s) was loaded...");
this.a = a;
this.b = b;
this.c = c;
}
public String getA()
{
return a;
}
public void setA( String a )
{
this.a = a;
}
public String getB()
{
return b;
}
public void setB( String b )
{
this.b = b;
}
public String getC()
{
return c;
}
public void setC( String c )
{
this.c = c;
}
}
追问
我通过反射出属性来看了下那个类里面的成员变量的类型,一个int,两个String还有一个date类型的,一共就4个属性。
问题是如果都是String或者都是int,就很好办了。现在不是的。
所以我想了下,能不能通过反射出成员变量的属性,然后再强转,可是用集合的话,放进去都是Object类型,取出来的时候进行强转,又怎么在参数那里进行循环呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
传入的参数类型错误,你传的都是字符串;你com.xx.xx.xx里的成员变量类型,肯定不都是String类型;
追问
一个int,两个String还有一个date类型的,一共就4个属性
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
异常字面意思是参数类型不匹配
你看看那个有参构造方法是不是有3个String参数啊.
你看看那个有参构造方法是不是有3个String参数啊.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询