反射实现单级VO

   

自动填充属性值【反射:调用必须存在对象,成员变量、方法、构造函数都是以对象的形式调用{一切皆对象} 】

  • Emp.java
package reflect;

public class Emp {
	private String ename;
	private String job;

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	@Override
	public String toString() {
		return "Emp [ename=" + ename + ", job=" + job + "]";
	}

}
  • EmpAction.java
package reflect;

import util.BeanOperation;

public class EmpAction {

	private Emp emp = new Emp();

	public Emp getEmp() {
		return emp;
	}

	public void setBeanValue(String msg) throws Exception {
		BeanOperation.setBenValue(this, msg);
	}
}
  • BeanOperation.java
package util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import reflect.EmpAction;
//emp.ename:caoqian|emp.job.leader

public class BeanOperation {
	private BeanOperation() {
	}

	public static void setBenValue(Object objectAction, String msg) throws Exception {
		String[] result = msg.split("\\|");
		for (int i = 0; i < result.length; i++) {
			String[] temp = result[i].split(":");
			// 取得真实的属性值
			String value = temp[1];
			String[] finalresult = temp[0].split("\\.");
			// 真实类名
			String realClassName = finalresult[0];
			// 属性名称
			String attr = finalresult[1];
			Object realobject = getRealObject(objectAction, realClassName);
			System.out.println(realobject);
			String realattr = finalresult[1];
			// 取得属性对象
			Field realfield = realobject.getClass().getDeclaredField(realattr);
			String setmethodName = "set" + Initcap(realattr);
			Method setmethod = realobject.getClass().getDeclaredMethod(setmethodName, realfield.getType());
			setmethod.invoke(realobject, value);
		}
	}

	public static Object getRealObject(Object objectAction, String realClassName) throws Exception {
		Object realobject = null;
		Class<?> cls = objectAction.getClass();
		Field field = cls.getDeclaredField(realClassName);
		if (field == null) {
			field = cls.getField(realClassName);
			if (field == null) {
				return null;
			}
		} else {
			String MethodName = "get" + Initcap(realClassName);
			Method method = cls.getMethod(MethodName);
			realobject = method.invoke(objectAction);
		}

		return realobject;

	}

	private static String Initcap(String realClassName) {

		return realClassName.substring(0, 1).toUpperCase() + realClassName.substring(1);
	}

}
  • Test.java
package reflect;

public class Test {

	public static void main(String[] args) throws Exception {
		String msg = "emp.ename:caoqian|emp.job:leader";
		EmpAction empAction = new EmpAction();
		empAction.setBeanValue(msg);
		System.out.println(empAction.getEmp());

	}

}
  • 遇到的错误:

          (一)ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

          (二)InstantiationException :当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值