Java反射与简单Java类

设计思路如下:


所有的操作是通过TestDemo类调用EmpActiob类的主要作用是在于定位要操作的属性类型,同时该程序符合所有简单的Java类开发形式,所以用一个单独的类(BeanOperation)实现此适配。
如:

Emp类设计:

package vo;

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 "Emp [name=" + name + ", job=" + job + "]";
	}
}

EmpAction类设计:

package vo;

import vo.BeanOperation;

public class EmpAction{
	private Emp emp = new Emp();
	public void setValue(String value) throws Exception {
		BeanOperation.setBeanValue(this, value);
	}
	public Emp getEmp() {
		return emp;
	}
}

BeanOperation类设计(公共程序类):

package vo;

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

//本类负责自动的vo匹配操作
public class BeanOperation{
	private BeanOperation() {}
	//负责设置类中的属性操作
	//actionObject 表示当前发出设置请求的程序类的当前对象
	//msg 属性的具体内容,格式为  emp.name:小明|emp.job:学生
	public static void setBeanValue(Object actionObject,String msg) throws Exception {
		//要想进行内容的设置,必须将字符串拆分
		//按照竖线拆分,取出所有要设置的内容
		String[] result = msg.split("\\|");
		//每次执行后只剩下 emp.name:小明
		for(int i = 0;i < result.length;i++) {
			//按照:进行拆分
			String[] temp = result[i].split(":");
			// emp.name
			String attribute = temp[0];
			//小明
			String value = temp[1];
			String[] fields = attribute.split("\\.");
			//获取当前操作的简单Java类对象
			Object currentObject = getObject(actionObject,fields[0]);
			//调用简单Java类的setter方法
			setObjectValue(currentObject,fields[1],value);
		}
	}
	//将给定字符串的首字母大写
	//msg 给定的字符串
	//return 返回首字母大写的字符串
	public static String initCap(String msg) {
		return msg.substring(0, 1).toUpperCase() + msg.substring(1); 
	}
	//负责调用EmpAction类中的getter方法取得简单Java类对象
	//obj 表示调用方法的所在类对象
	//attribute 表示属性名称
	//return 调用对象结果
	public static Object getObject(Object obj,String attribute) throws Exception {
		//调用指定的Field对象,目的是取得对象类型,如果没有此属性意味着操作无法继续进行
		Field field = obj.getClass().getDeclaredField(attribute);
		if(field == null) {
			//第二次尝试从父类中取得该属性
			field = obj.getClass().getField(attribute);
		}
		if(field == null) {
			//两次都未取得指定属性的对象,表示该对象一定不存在
			return null;
		}
		String methodName = "get" + initCap(attribute);
		Method method = obj.getClass().getMethod(methodName);
		return method.invoke(obj);
	}
	//根据指定的类对象设置指定类中的属性,调用setter方法
	//obj 属性所在类的实例化对象
	//attribute 属性名称
	//value 属性内容
	public static void setObjectValue(Object obj,String attribute,String value) throws Exception{
		Field field = obj.getClass().getDeclaredField(attribute);
		//判断属性是否存在
		if(field == null) {
			//第二次尝试从父类中取得该属性
			field = obj.getClass().getField(attribute);
		}
		if(field == null) {
			//两次都未取得指定属性的对象,表示该对象一定不存在
			return;
		}
		String methodName = "set" + initCap(attribute);
		Method method = obj.getClass().getMethod(methodName,field.getType());
		method.invoke(obj, value);
	}
}

Test类设计:

package vo;

public class Test{
	public static void main(String[] args) throws Exception{
		String value = "emp.name:小明|emp.job:学生";
		EmpAction empAction = new EmpAction();
		empAction.setValue(value);
		System.out.println(empAction.getEmp());
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值