Java反射與簡單Java類
阿新 • • 發佈:2019-01-01
設計思路如下:
所有的操作是通過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());
}
}