反射小工具
一、類的復制
copyProperties(Object sourceObject,Object targetObject);
ps:時間不夠了,這個很糙,很多情況都還沒有考慮。下次有時間了再好好寫一個
public void copyProperties(Object sourceObject,Object targetObject){
/*
* 首先獲取到傳遞過來的兩個類的Class對象
*/
Class sourceClass = sourceObject.getClass();
Class targetClass = targetObject.getClass();
/*
* 獲取到對象中的所有屬性
* getFields()獲得某個類的所有的公共(public)的字段,包括父類。
*
* getDeclaredFields()獲得某個類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段
*
* 在類中設置屬性的時候一般都是設置為private,所以這裏使用getDeclaredFields()方法
*/
Field[] sourceFields = sourceClass.getDeclaredFields(); //註意,這個地方需要引入反射的包
Field[] targetFields = targetClass.getDeclaredFields();
/*
* 獲取到類中的所有屬性時,就有兩種處理方法
* 一、嵌套循環
* 二、單個循環
*/
boolean flag = true;
if(flag) {
//嵌套循環
if(sourceFields != null && sourceFields.length >0){
if(targetFields != null && targetFields.length > 0) {
//如果類中有屬性,那麽嵌套循環
for(Field sourceField : sourceFields) {
for(Field targetField : targetFields) {
//獲取到初始類的屬性名稱
String sourceFieldName = sourceField.getName();
Class sourceFieldType = sourceField.getType();
//獲取到目標類的屬性名稱
String targetFieldName = targetField.getName();
Class targetFieldType = targetField.getType();
//判斷類名是否一樣
if(sourceFieldName.equals(targetFieldName) && sourceFieldType.equals(targetFieldType)) {
//如果一樣,那麽就執行復制
/**
* 在復制這個地方,還有一個問題
* 如果說目標的對象該屬性有值,那麽要不要重新賦值
* 這個地方加一個判斷即可
*/
String getMethodName = "get" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右
String setMethodName = "set" + sourceFieldName.substring(0) + sourceFieldName.substring(1); //substring包左不包右
try {
//通過方法名稱獲取到類中的方法
Method getMethod = sourceClass.getMethod(getMethodName);
/*
* 獲取到方法之後,直接執行
* method.invoke(Object,args);
* Object : 需要執行這個方法的對象
* args : 參數
*/
Object getMethodValue = getMethod.invoke(sourceObject);
Method setMethod = targetClass.getMethod(setMethodName, targetFieldType);
setMethod.invoke(targetObject, getMethodValue);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //因為是getXxx()所以不需要
}else {
}
}
}
}else {
//如果該類中沒有屬性,那麽這個方法就沒有意義,直接返回
return;
}
}else {
//如果該類中沒有屬性,那麽這個方法就沒有意義,直接返回
return;
}
}else {
//單個循環
}
}
反射小工具