Java中反射實現Bean轉化
阿新 • • 發佈:2018-12-12
package com.dobn.bdgcgl.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用於賦值的實體類 * @param class1 需要待賦值的實體類 * @author ym * @CreateTime 2012-11-22下午03:23:23 * 描述:反射實體類賦值 */ public static void reflectionAttr(Object class1,Object class2) throws Exception{ Class clazz1 = Class.forName(class1.getClass().getName()); Class clazz2 = Class.forName(class2.getClass().getName()); // 獲取兩個實體類的所有屬性 Field[] fields1 = clazz1.getDeclaredFields(); Field[] fields2 = clazz2.getDeclaredFields(); // 遍歷class1Bean,獲取逐個屬性值,然後遍歷class2Bean查詢是否有相同的屬性,如有相同則賦值 for (Field f1 : fields1) { Object value = invokeGetMethod(class1 ,f1.getName(),null); for (Field f2 : fields2) { if(f1.getName().equals(f2.getName())){ Object[] obj = new Object[1]; obj[0] = value; invokeSetMethod(class2, f2.getName(), obj); } } } } /** * * 執行某個Field的getField方法 * * @param clazz 類 * @param fieldName 類的屬性名稱 * @param args 引數,預設為null * @return */ private static Object invokeGetMethod(Object clazz, String fieldName, Object[] args) { String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1); Method method = null; try { method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName); return method.invoke(clazz); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * * 執行某個Field的setField方法 * * @param clazz 類 * @param fieldName 類的屬性名稱 * @param args 引數,預設為null * @return */ private static Object invokeSetMethod(Object clazz, String fieldName, Object[] args) { String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1); Method method = null; try { Class[] parameterTypes = new Class[1]; Class c = Class.forName(clazz.getClass().getName()); Field field = c.getDeclaredField(fieldName); parameterTypes[0] = field.getType(); method = c.getDeclaredMethod("set" + methodName,parameterTypes); return method.invoke(clazz,args); } catch (Exception e) { e.printStackTrace(); return ""; } } }