import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; /** * 通过反射获取某个对象下的属性值,或通过父类获取 * User: wangyongfei * Date: 2016/8/10 * Time: 9:56 */ public class TestObjectRef { private static final Logger LOGGER = LoggerFactory.getLogger(TestObjectRef.class); /** * 对象相同 * 对象属性name相同 * @param list */ public static Object object2Fields(List<Object>list,Object targetObject, String filteFieldName){ for(Object sourceObject: list){ Object rtnVal = getObjectProprityValue(sourceObject, targetObject, filteFieldName); if(rtnVal == null){ continue; } return rtnVal; } return null; } /** * 如果当前类查找不到,则从父类属性中查找 * @param object 当前类 * @param filteFieldName 查找字段 * @return */ public static Object getSupperClassPropertity(Object object,String filteFieldName){ Class<?>clazz = object.getClass(); if(clazz != null && clazz.getGenericSuperclass()!=null){ Class claSupper = clazz.getSuperclass(); return getProperty(claSupper, object,filteFieldName); } return null; } /** * 过滤父类中字段 * @param _class * @param bean * @param filteFieldName * @return */ private static Object getProperty(Class _class, Object bean, String filteFieldName) { Object obj = null; Field[] fields = _class.getDeclaredFields(); //private调整为public Field.setAccessible(fields, true); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (filteFieldName.equals(field.getName())) { try { obj = field.get(bean); } catch (IllegalArgumentException e) { LOGGER.error(e.getMessage()); } catch (IllegalAccessException e) { LOGGER.error(e.getMessage()); } break; } } if (obj == null && _class.getGenericSuperclass() != null) { obj = getProperty(_class.getSuperclass(), bean, filteFieldName); } return obj; } /** * 获取过滤对象对应属性值 * // TODO: 2016/8/10 集合类型处理 list, map等 --待完善,目前已满足需求 * @param sourceObject 数据源对象 * @param targetObject 过滤目标对象 * @param filteFieldName 过滤目标对象对应熟悉字段 * @return */ private static Object getObjectProprityValue(Object sourceObject, Object targetObject, String filteFieldName) { if(sourceObject == null || sourceObject.getClass() == null || filteFieldName == null || "".equalsIgnoreCase(filteFieldName)){ return null; } Boolean flag = sameObjectInstance(sourceObject, targetObject); Field[] fields = sourceObject.getClass().getDeclaredFields(); for(Field field: fields){ String str = field.getName(); Method m = null; try { m = sourceObject.getClass().getMethod("get" + str.substring(0, 1).toUpperCase()+""+str.substring(1, str.length())); try { Object object = m.invoke(sourceObject); if (!flag && validProperityType(field.getType().getName())) {//不是同一对象且类型为class,则继续迭代 Object rtnVal = getObjectProprityValue(object, targetObject, filteFieldName); if(rtnVal == null){ continue; } return rtnVal; } else { if(flag){ if(filteFieldName.equalsIgnoreCase(field.getName())){ return object; } } continue; } } catch (IllegalAccessException e) { LOGGER.info("对象转换处理异常, e:{}", e.getMessage()); } catch (InvocationTargetException e) { LOGGER.info("对象转换处理异常, e:{}", e.getMessage()); } } catch (NoSuchMethodException e) { LOGGER.info("没有找到对应方法, e:{}", e.getMessage()); } } //如果没找到,则从父类中查找 if(flag){ return getSupperClassPropertity(sourceObject,filteFieldName); } return null; } /** * 校验两个对象是否属于同一对象实例 * @param sourceObject * @param targetObject * @return */ public static Boolean sameObjectInstance(Object sourceObject, Object targetObject){ if(sourceObject == null || targetObject == null) return Boolean.FALSE; if(sourceObject.getClass().getName().equals(((Class) targetObject).getName())){ return Boolean.TRUE; } return Boolean.FALSE; } /** * 类型校验方法 * 1.以后如果出现特殊类型,在此方法中追加过滤即可 * 2.目前只区分类与普通属性 * 3.如果有特殊逻辑,可根据具体需要扩展此方法 * @param type 类型值 * @return */ public static Boolean validProperityType(String type){ if (type.equals("java.lang.String")) { return Boolean.FALSE; } if (type.equals("java.lang.Integer") || type.equals("int")) { return Boolean.FALSE; } if (type.equals("java.lang.Short")) { return Boolean.FALSE; } if (type.equals("java.lang.Double") || type.equals("double")) { return Boolean.FALSE; } if (type.equals("java.lang.Boolean") || type.equals("boolean")) { return Boolean.FALSE; } if (type.equals("java.util.Date")) { return Boolean.FALSE; } if (type.equals("java.util.List")) { return Boolean.FALSE; } if (type.equals("java.lang.Long") || type.equals("long")) { return Boolean.FALSE; } return Boolean.TRUE; } public static Map<String, String> templateFormat( Map<String, List<String>> hashMap, Object... object) { if(hashMap == null || hashMap.size() <=0 ){ return null; } List<Object>list = new ArrayList<>(); Collections.addAll(list, object); Map<String, String> map = new HashMap<>(); for(String key: hashMap.keySet()){ try { Class<?> classType = Class.forName(key); for(String str: hashMap.get(key)) { System.out.println(str+":" + object2Fields(list, classType, str)); } } catch (ClassNotFoundException e) { LOGGER.warn("[模板格式转换]类查询异常,error:{}", e.getMessage()); } } return null; } }