博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过反射获取某个对象下的属性值,或通过父类获取
阅读量:6853 次
发布时间:2019-06-26

本文共 6719 字,大约阅读时间需要 22 分钟。

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(Listlist,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
templateFormat( Map
> hashMap, Object... object) { if(hashMap == null || hashMap.size() <=0 ){ return null; } List
list = new ArrayList<>(); Collections.addAll(list, object); Map
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; }}

  

转载于:https://www.cnblogs.com/FCWORLD/p/5757878.html

你可能感兴趣的文章
JS获取页面URL信息
查看>>
tomcat
查看>>
WebStorm 快键键
查看>>
Google code android 开源项目 集合
查看>>
tomcat 调优
查看>>
E - Triangle
查看>>
Web安全学习笔记(一)
查看>>
学习微信小程序之css13关于盒子外边距的合并
查看>>
C语言算法竞赛入门(二)---数组元素移动 、排序问题 、猴子选大王问题
查看>>
sas中的sql(5) 纵向操作数据集 Except、Intersect、Union、OuterUnion
查看>>
Javascript弹出对话框类
查看>>
arc 和 non-arc 的混合使用
查看>>
Tiny6410学习移植usb无线网卡(一)
查看>>
洛谷——P2656 采蘑菇
查看>>
sexi部署openstack (devstack) 、二
查看>>
[分享]OpenGL实现的翻页效果
查看>>
在WinForms中使用自定义纸张
查看>>
codeforces 721C Journey
查看>>
如何设计制作专业PPT
查看>>
Algorithm3: 获得一个int数中二进制位为1 的个数
查看>>