为了解决某个问题,需要把对象的非基本数据类型,如自定义的一些类型,如在我的包: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);
}
}
}
}
}