反射与单级VO操作

对于一个Emp类:

public class Emp {
	private String name;
	private String job;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	@Override
	public String toString() {
		return "[name:"+name+" ,job:"+job+"]";
	}
}

可以通过实例化类对象通过getter()和setter()方法给属性赋值。

但是如果一个类有很多的属性,那么在主类中调用很多次的getter()和setter()方法,不仅操作麻烦,还会产生很多的代码。

所以为了简化,只需要输入字符串"属性名:属性值|属性名:属性值|属性名:属性值|..."一次将属性赋值。

反射实现单级VO的操作步骤:

(1)具体类(Emp):定义所需要的所有属性,以及个属性的getter()和setter()方法。并覆写toString方法
(2)Test类():该类中的主方法通过实例化第三方类EmpAction类的对象,从而调用EmpAction类的用于接收字符串的方法.
(3)EmpAction类:该类需要实例化具体类Emp类的对象,用于反射操作中的使用;定义一个方法用于接收在主方法中传入的字符串,在该方法中调用实现解耦的BeanOperation类的一个方法,从而利用BeanOperation类中的方法操作该字符串;再定义一个方法用于通过反射取得Emp类对象以及打印具体类Emp类的对象从而判断是否将各属性设置成功
(4)工具类(BeanOperation类):该类用于真正实现字符串内容到各属性值设置的操作的类

主类:

public class Test {
	public static void main(String[] args) throws Exception {
		String msg="emp.name:holle|emp.job:Linux";
		EmpAction empAction=new EmpAction();
		empAction.getInstance(msg);
		System.out.println(empAction.getEmp());
	}
}

第三方类:EmpAction类。

public class EmpAction {
	private Emp emp;
	
	public void getInstance(String msg) throws Exception
	{
		BeanOperation.getBeanOperation(this,msg);
	}
	public Emp getEmp() {
		return emp;
	}
}

第三方类和真正操作的方法实现解耦的工具类(BeanOperation类)。

/*
 * 本类负责实现自动的VO匹配处理操作
 */
public class BeanOperation {
	private BeanOperation()
	{
	}
	
	/*
	 * 负责类中的属性操作
	 * object表示当前发出设置请求的程序类的当前对象
	 * msg属性的具体内容,格式为:"属性名称:内容|属性名称:内容"
	 */
	public static void getBeanOperation(Object object,String msg)throws Exception
	{
		//第一次拆分:按照“|”拆
		String[] realstring=msg.split("\\|");
		for(int i=0;i<realstring.length;i++)
		{
			//第二次拆分:按照“:”拆分,把内容和属性拆开
			String[] temp=realstring[i].split(":");
			String realstringname=temp[0];    //保存的是类名.属性
			String value=temp[1];             //保存的是属性的值
			//第三次拆分:将类名和属性名拆开
			String[] objectstring=realstringname.split("\\.");
			String classstringname=objectstring[0];   //类对象名
			String objectstringname=objectstring[1];  //属性名
			//获取java类对象
			Object realobject=getObject(object, classstringname);   //取得对象
			
			//设置类中属性
			Field realfield=realobject.getClass().getDeclaredField(objectstringname);
			String methodName="set"+initCap(objectstringname);
			Method method=object.getClass().getDeclaredMethod(methodName,realfield.getType());
			method.invoke(object, value);
		}
	}
	
	
	/*
	 * 将给定字符串的首字母大写
	 * str给定字符串
	 * 返回首字母大写的字符串
	 */
	public static String initCap(String str)
	{
		return str.substring(0,1).toUpperCase()+str.substring(1);
	}
	
	
	/*
	 * 负责调用XXXAction类中的getter方法取得简单的java对象
	 * object表示调用方法的所在类的对象
	 * classstringname表示属性名称
	 * 返回调用对象结果
	 */
	public static Object getObject(Object object,String classstringname) throws Exception
	{
		Object realobj=null;
		Class<?> cls=object.getClass();
		Field field=null;
		try {
			field=cls.getDeclaredField(classstringname);    //取得当前类属性
			if(field==null)
			{
				field=cls.getField(classstringname);        //当前类没有指定属性就在父类中找,不考虑权限
				if(field==null)
				{
					return null;
				}
			}else {
				//通过方法得到emp对象
				String methodName="get"+initCap(classstringname);
				Method method=cls.getDeclaredMethod(methodName);   //得到类中方法
				realobj=method.invoke(object);
			}
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return realobj;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值