论坛首页 入门讨论版 Java

请教:利用java反射机制动态创建javaben对象

浏览 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发现其原因可能是因为类型包装失败(如果该方法是实例方法,且指定对象参数不是声明基础方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;或者如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。),但是不知道该如何来修改各位请帮下忙。
   
最后更新时间:2007-11-22
没人理么,太简单的问题??
   
0 请登录后投票
论坛首页 入门讨论版 Java

跳转论坛:
JavaEye推荐