通过反射获取某个对象下的属性值,或通过父类获取

java;collapse:true;;gutter:false; import org.slf4j.Logger; import org.slf4j.LoggerFactory;</p> <p>import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*;</p> <p>/*<em> * 通过反射获取某个对象下的属性值,或通过父类获取 * User: wangyongfei * Date: 2016/8/10 * Time: 9:56 </em>/ public class TestObjectRef {</p> <pre><code>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){ Classclazz = 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() 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; } </code></pre> <p>}

Original: https://www.cnblogs.com/FCWORLD/p/5757878.html
Author: 聊聊IT那些事
Title: 通过反射获取某个对象下的属性值,或通过父类获取

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574986/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C# 多线程中CancellationToken(取消令牌)以及链式反应

    using System; using System.Net.Http; using System.Threading; using System.Threading.Channe…

    Java 2023年5月29日
    088
  • Mybatis动态查询

    😎多条件的查询 if 根据标签中test的属性所对应的表达式决定标签中的内容是否拼接到sql语句中 select * from t_user where ‘cwlz’=’cwlz’…

    Java 2023年6月8日
    088
  • 我对java序列化的理解

    我对java序列化的理解 ​ 通过ObjectOutputStream输出流保存实体类所 产生的文件,每一个流都一个序列化ID,如果我们不设置UID的话,一旦我们修改代码,这个文件…

    Java 2023年6月7日
    091
  • 崔用志-微信开发-java版本

    崔用志-微信开发-java版本 今天看到一些关于微信开发的知识蛮好的博客,分享给大家,希望对大家有帮助。 总结来自:http://www.cuiyongzhi.com/ Origi…

    Java 2023年5月29日
    073
  • DDD从入门到精通:基础篇

    这篇文章主要还是表述清楚DDD相关的基础概念,因为DDD入门有一定的专业名词,还是得有个基本的了解。 先讲解下领域模型作用: 对软件需求进行设计,维持其内在逻辑的一致性 1)划分边…

    Java 2023年6月15日
    0102
  • 【java线程】新版基于生产者队列消费者的表迁移器

    前作: 【代码下载地址】 【主要改进点】 1.原来的DataQueue是手写的,实际上使用java提供的java.util.concurrent.BlockingQueue就完全够…

    Java 2023年5月29日
    092
  • 人生苦短,我用python之三

    HTTP协议及Requests库的方法 requests库的主要方法:requests.request()构造一个请求 requests.get()获取HTML网页的主要方法,对应…

    Java 2023年6月7日
    085
  • JVM学习笔记之垃圾收集算法【四】

    一、什么是垃圾回收? 垃圾回收(英语:Garbage Collection,缩写为 GC),在计算机科学中是一种自动的存储器管理机制。当一个电脑上的动态存储器不再需要时,就应该予以…

    Java 2023年6月5日
    0135
  • Java中的屠龙之术(二):如何方便快捷地生成.class文件

    ​ 在之前的”Java中的屠龙之术:如何修改语法树”中,我们详细介绍了如何使用Javac源码提供的工具类来修改语法树。 而在此基础上,有一款开源工具java…

    Java 2023年5月29日
    0106
  • 观察者模式,无需多线程完成数据监听

    大家好,我们今天来了解一个新的设计模式—— 观察者模式。 观察者模式的思路很简单,它被广泛地用在各种数据监控上。很多时候我们希望监听某个数据的变化,希望一旦获悉它的变化之后立即采取…

    Java 2023年5月30日
    094
  • ThreadLocal源码解析,内存泄露以及传递性

    我想ThreadLocal这东西,大家或多或少都了解过一点,我在接触ThreadLocal的时候,觉得这东西很神奇,在网上看了很多博客,也看了一些书,总觉得有一个坎跨不过去,所以对…

    Java 2023年6月5日
    0107
  • java设计模式

    一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理…

    Java 2023年5月29日
    070
  • C++基础-异常处理

    C++异常处理(较浅) 基本概念 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现异常的情况,保证程序运行的稳定性和健壮性,防止程序崩溃。但是过渡使用会影…

    Java 2023年6月5日
    073
  • 一次编程小练习:根据流量计数动态选择不同的策略

    持续优化一个程序的过程,也是编程技艺提升和编程的乐趣所在。 在实际应用中, 往往会承载两种不同的流量。一种是日常流量,比较平稳且持续;一种是极端流量,比较尖锐且短暂。应对这种情况,…

    Java 2023年6月9日
    078
  • 【力扣】1486. 数组异或操作

    给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。 请返回 num…

    Java 2023年6月8日
    071
  • JavaSE-分页工具方法

    借用mybatisPlus的分页对象,可以自己创建一个此方法针对集合设置分页,与SQL无关。 /** * * @param pageNo &#x7B2C;&#x51…

    Java 2023年6月9日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球