浏览 528 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-11-21 关键字: java反射机制
java新人,请教个问题,我有这样的需求:一个javabean类利用java反射机制动态生成若干g个次javabean对象对象,并动态调用setXXX方法来给其赋值,但是在调用invoke方法时总是抱错,下面是代码:
下面是一个简单的反射类 import java.lang.reflect.*;
import cn.regie.pubresource.exception.FileExecption;
public class ReflectClass {
public Class classType;
public Object object;
/**
* 构造函数
* @param object
*/
public ReflectClass(Object object)
{
this.object=object;
this.classType=object.getClass();//得到对象类型
}
/**
* 得到制定方法返回值
* @return
*/
public Object getMethodValue()
{
return null;
}
/**
* 得到所有属性;
* @return fields
*/
public Field[] getAllAttibute()
{
Field[] fields=classType.getDeclaredFields();
return fields;
}
/**
* 得到所有方法;
* @return fields
*/
public Method[] getAllMethod()
{
Method[] methods=classType.getDeclaredMethods();
return methods;
}
/**
* 针对javabean得到get方法;
* @return fields
* @throws FileExecption
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public Object getBeanGetMethod(String fieldName) throws FileExecption
{
......
}
/**
* 针对javabean得到set方法;
* @return fields
* @throws FileExecption
* @throws NoSuchMethodException
* @throws SecurityException
*/
public Method getBeanSetMethod(Field fieldName) throws FileExecption
{
Method setMethod=null;
for(int i=0;i<getAllAttibute().length;i++)
{
//System.out.println("------------"+getAllAttibute()[i].getName()+"---"+fieldName.getName());
if(getAllAttibute()[i].getName().equals(fieldName.getName()))
{
String firstLetter=fieldName.getName().substring(0,1).toUpperCase();
//获得和属性对应的setXXX()方法的名字
String setMethodName="set"+firstLetter+fieldName.getName().substring(1);
//获得和属性对应的setXXX()方法
try {
setMethod=classType.getMethod(setMethodName,new Class[]{getAllAttibute()[i].getType()});
System.out.println("------------"+getAllAttibute()[i].getType());
} catch (SecurityException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
throw new FileExecption("ClassTransitionError");
} catch (IllegalArgumentException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
throw new FileExecption("ClassTransitionError");
}
}
}
return setMethod;
}
}
一下是测试调用的代码
ReflectClass refclass=new ReflectClass(object);//引入java反射机制,object为传入的javabean对象
Object newObj=null;
for(int i=0;i<5;i++)//bean中共5个属性,
{
newObj=refclass.classType.getConstructor(new Class[]{}).newInstance(new Object[]{});//得到一一个新的实例
Method setMethod=refclass.getBeanSetMethod((Field)attributeNames[i]);
setMethod.invoke(object,new Object[]{value});////调用set方法设置值,value为参数值
}
然后再执行到setMethod.invoke(object,new Object[]{value});就会抱 java.lang.IllegalArgumentException: argument type mismatch错误,查了api发现其原因可能是因为类型包装失败(如果该方法是实例方法,且指定对象参数不是声明基础方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;或者如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。),但是不知道该如何来修改各位请帮下忙。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-11-22
没人理么,太简单的问题??
|
|
| 返回顶楼 | |


