1. 程式人生 > >Java反射與簡單Java類

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());
	}
}