爲了解決某個問題,需要把對象的非基本數據類型,如自定義的一些類型,如在我的包:com.shutao.test下面的,和一些java.util.Set類型的設置爲NULL,這裏寫了個通用類,包括調用自己的和父類的setter方法,大家可參考參考:
/**
* 調用對象的setter方法,將非基本數據類型統一設置爲null值
* @author linshutao
* */
public static void setFieldToNull(Object o) {
//獲取自己的屬性
Field[] fields1=o.getClass().getDeclaredFields();
//獲得父類的屬性
Field[] fields2=o.getClass().getSuperclass().getDeclaredFields();
//合併所有屬性
Field[] fields = new Field[fields1.length+fields2.length];
for(int i=0;i<fields1.length;++i){
fields[i] = fields1[i];
}
for(int j=0;j<fields2.length;++j){
fields[fields1.length+j] = fields2[j];
}
for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName(); //屬性名稱
String filedType = fields[i].getType().toString(); //屬性類型
//去掉前面的class啊inteface啊這些說明
filedType = filedType.substring(filedType.indexOf(" ")+1);
//如果是我自定義的類型的
if(filedType.indexOf("com.shutao.test")!=-1 ||
filedType.indexOf("Set")!=-1){
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//得到方法名稱
String setter = "set" + firstLetter + fieldName.substring(1);
try {
//先調用自身的方法
Method callMethod = o.getClass().getMethod(setter, Class.forName(filedType));
callMethod.invoke(o, new Object[] {null});
} catch (Exception e) {
try {
//上面調用自身的方法如果調不到會拋異常,這裏再調用父類的方法
Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(setter,Class.forName(filedType));
callMethod.invoke(o, new Object[] {null});
} catch (Exception e1) {
log.error(e1.getMessage(),e1);
}
}
}
}
}
另外有個地方爲了避免set集合因lazy=true而引起的懶加載異常,需要統一進行實例話,與是寫了下面這個方法:
/**
* 調用對象的Set類型的getter方法,可用於實例化集合,避免hibernate的lazy引起的異常
* @author linshutao
* */
public static void callGetMethodForSetField(Object o) {
Field[] fields = getFieldsIncludeParent(o);
for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName(); //屬性名稱
String filedType = fields[i].getType().toString(); //屬性類型
//去掉前面的class啊inteface啊這些說明
filedType = filedType.substring(filedType.indexOf(" ")+1);
//如果是Set類型的
if(filedType.indexOf("Set")!=-1){
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//得到方法名稱
String method = "get" + firstLetter + fieldName.substring(1);
try {
//先調用自身的方法
Method callMethod = o.getClass().getMethod(method, new Class[] {});
//調用set的size用於實例化
Set set = (Set)callMethod.invoke(o, new Object[] {});
set.size();
} catch (Exception e) {
try {
//上面調用自身的方法如果調不到會拋異常,這裏再調用父類的方法
Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(method,new Class[] {});
Set set = (Set) callMethod.invoke(o, new Object[] {});
set.size();
} catch (Exception e1) {
log.error(e1.getMessage(),e1);
}
}
}
}
}