合并类属性的公共方法:
public class ReflectUtil {
static Logger log = Logger.getLogger(ReflectUtil.class);
/**
* 合并对象,将src的值合并入des,如果值为null,则不覆盖
* @param <T>
* @param srcObj
* @param desObj
*/
public static <T> void mergeObject(T srcObj, T desObj) {
if(srcObj == null || desObj == null) return;
Field[] fs = srcObj.getClass().getDeclaredFields();
for (int i=0; i<fs.length; i++) {
try{
fs[i].setAccessible(true);
Object value = fs[i].get(srcObj);
if(null != value){
fs[i].set(desObj, value);
}
fs[i].setAccessible(false);
}catch(Exception e){
log.error(e);
}
}
}
/**
* 合并对象(无编译时型别检查版),将src的值合并入des,如果值为null,则不覆盖 (使用时请确认需要合并的两个对象的field的定义一致!!)
* @param srcObj source Object
* @param desObj destine Object
*/
public static void mergeObject_diff(Object srcObj, Object desObj) {
if(srcObj == null || desObj == null) return;
Field[] fs1 = srcObj.getClass().getDeclaredFields();
Field[] fs2 = desObj.getClass().getDeclaredFields();
for (int i=0; i<fs1.length; i++) {
try{
fs1[i].setAccessible(true);
Object value = fs1[i].get(srcObj);
fs1[i].setAccessible(false);
if(null != value){
fs2[i].setAccessible(true);
fs2[i].set(desObj, value);
fs2[i].setAccessible(false);
}
}catch(Exception e){
log.error(e);
}
}
}
/**
* 使用反射调用方法,唯一参数版
* @param obj
* @param methodName
* @param valueClazz
* @param value
* @return
*/
public static Object callMethod(Object obj,String methodName,Class valueClazz, Object value){
return callMethod0(obj,methodName,new Class[]{valueClazz},new Object[]{value});
}
/**
* 使用反射调用方法,多参数版
* @param <T>
* @param obj
* @param methodName
* @param valueClazz
* @param value
* @return
*/
public static Object callMethod0(Object obj,String methodName,Class[] valueClazz, Object[] value){
try {
if(null != valueClazz[0]){
Method method = obj.getClass().getMethod(methodName, valueClazz);
return method.invoke(obj, value);//if method return void this value is null
}else{
Method method = obj.getClass().getMethod(methodName);
return method.invoke(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 直接获取对象的属性值,处理非bean规范的类
* @param obj
* @param name
* @return
*/
public static <T> T getFieldValue(Object obj,String name){
try {
Field fs = obj.getClass().getDeclaredField(name);
fs.setAccessible(true);
T retValue = (T) fs.get(obj);
fs.setAccessible(false);
return retValue;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 初始化属性列表
* @param <T>
* @param cols 在页面显示为几列
* @param obj 泛型对象,用于反射
* @return
*/
public static <T> List<List<T>> initPropertyList(int cols,T obj) {
List<List<T>> outter = new ArrayList<List<T>>();
List<T> contents = Dao.find("from " + obj.getClass().getName());
if(null != contents || contents.size() != 0){
int size = contents.size();
List<T> inner = new ArrayList<T>();
int i = 0;
while(i<size){
if (i%cols == 0){
inner = new ArrayList<T>();
outter.add(inner);
}
inner.add(contents.get(i));
i++;
}
for(int j=0;j<(cols-size)%cols;j++){
try {
Constructor con = obj.getClass().getConstructor(String.class);
T nullObj = (T) con.newInstance(" ");
inner.add(nullObj);
} catch (Exception e) {
log.error(e);
}
}
}
return outter;
}
public static String genWhereClauseByObject(Object obj){
String result=" where 1=1";
Field[] fs = obj.getClass().getDeclaredFields();
try{
for(Field f:fs){
f.setAccessible(true);
Object value = f.get(obj);
if(null != value && !"".equals(value.toString())){
String val = "";
if(value.getClass()==java.util.Date.class){
val = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value);
}
else if(value.getClass()==java.sql.Timestamp.class){
val = value.toString().substring(0,19);
}
else{
if(isNeedLike(obj.getClass().getSimpleName().toLowerCase(),f.getName()))
result += " and " + f.getName() + " like '%" + value.toString() + "%'";
else
result += " and " + f.getName() + "='" + value.toString() + "'";
}
if(!"".equals(val)) result += " and " + f.getName() + ">='" + val + "' and "+f.getName()+" <= '"+val.substring(0,10)+" 23:59:59'";
}
f.setAccessible(false);
}
}catch(Exception e){
log.error(e);
}
return result;
}
private static boolean isNeedLike(String className, String fieldName) {
return ("ordercontactinfo".equals(className)&& "cell".equals(fieldName));
}
public static List<String> genMainSearchSqlString(MainSearch mainSearch){
List<String> sqls=new ArrayList<String>();
Field[] fs = mainSearch.getClass().getDeclaredFields();
try{
for(Field f:fs){
f.setAccessible(true);
Object value = f.get(mainSearch);
if(null != value){
String val = "select distinct orderId as orderid from " + value.getClass().getSimpleName().toLowerCase();
String whereClause = genWhereClauseByObject(value);
if(!" where 1=1".equalsIgnoreCase(whereClause))
sqls.add(val + whereClause);
}
f.setAccessible(false);
}
}catch(Exception e){
log.error(e);
}
return sqls;
}
}
调用方式:
ReflectUtil.mergeObject(pnr, oldpnr);
此方法应用场景为:两个方法分别只能获取到一个vo的一部分属性但是方法中需要两个方法取到的属性值之和(这种情况主要产生在系统调用不同的接口),此时就可能这个方法。
注:两个参数都是同一种vo,如果两个vo中都取到的同一个属性值的话可能会有属性值覆盖的情况(本人没测过,使用此方法时要注意这一点)