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]);
展开
 我来答
yugi111
2013-08-24 · TA获得超过8.1万个赞
知道大有可为答主
回答量:5.1万
采纳率:70%
帮助的人:1.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类型,取出来的时候进行强转,又怎么在参数那里进行循环呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c69fc25
2013-08-24 · 超过21用户采纳过TA的回答
知道答主
回答量:108
采纳率:100%
帮助的人:43.3万
展开全部
传入的参数类型错误,你传的都是字符串;你com.xx.xx.xx里的成员变量类型,肯定不都是String类型;
追问
一个int,两个String还有一个date类型的,一共就4个属性
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Billy119
2013-08-24 · TA获得超过124个赞
知道小有建树答主
回答量:70
采纳率:0%
帮助的人:91.6万
展开全部
异常字面意思是参数类型不匹配
你看看那个有参构造方法是不是有3个String参数啊.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式