spring 使用其他类protected方法_Java操作bean、属性、方法的使用工具类

在实际的项目开发中,反射操作类的实例、属性赋值、执行方法是常规的操作,虽然spring提供了比较完整的API来执行上述操作,不过在实际的应用中,spring的函数隐藏比较深,比较分散,小伙伴们可能懒得花时间去寻找。本类集成了一些常规操作,值得收藏,请关注展翅,展翅会定时更新有项目实战价值的代码和技术。

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import net.sf.json.JsonConfig;import org.apache.commons.beanutils.PropertyUtils;import org.springframework.util.ObjectUtils;import com.esotericsoftware.reflectasm.MethodAccess;import com.ivt.monitor.utils.common.CommonUtils;import com.ivt.monitor.utils.common.StringUtil;public class ReflectASMUtils {/** * Class,MethodAccess的缓存map */private static Map, MethodAccess> classMethodAccessMap;static{classMethodAccessMap = new HashMap, MethodAccess>();}/** * 根据字段名获取对应的bean的值
* 为了避免因为bean的set,get不规范而出异常,加上PropertyUtils.getProperty(bean, field); * @param bean * @param field * @return * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */public static Object getProperty(Object bean, String field) throws IllegalAccessException,InvocationTargetException, NoSuchMethodException{try{Class> clazz = bean.getClass(); String methodName = "get".concat(field.substring(0, 1).toUpperCase().concat(field.substring(1, field.length())));MethodAccess access = getCacheMethodAccess(clazz);Object obj = access.invoke(bean, methodName);/*if(obj != null && obj instanceof Date){obj = CommonUtils.getDateString((Date) obj);}*/return obj;}catch (Exception e) {return PropertyUtils.getProperty(bean, field);}}/** * 根据字段名为bean设置对应的值
* 为了避免因为bean的set,get不规范而出异常,加上PropertyUtils.setProperty(bean, field, value); * @param bean * @param field * @param value * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException */public static void setProperty(Object bean, String field, Object value) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{try{Class> clazz = bean.getClass(); String methodName = "set".concat(field.substring(0, 1).toUpperCase().concat(field.substring(1, field.length())));MethodAccess access = getCacheMethodAccess(clazz);access.invoke(bean, methodName, value);}catch (Exception e) {PropertyUtils.setProperty(bean, field, value);}}/** * map返回成一个bean * @param clazz * @param map * @return */public static T setBeanValue(Class clazz, Map map){try{T bean = clazz.newInstance();if(bean == null || CommonUtils.isCollectionEmpty(map)){return null;}Set keys = map.keySet();for(String field : keys){String methodName = "set".concat(field.substring(0, 1).toUpperCase().concat(field.substring(1, field.length())));MethodAccess access = getCacheMethodAccess(clazz);access.invoke(bean, methodName, map.get(field));}return bean;}catch(Exception e){return null;}}/** * mapList返回成一个bean list * @param clazz * @param mapList * @return */public static List setBeanListValue(Class clazz, List> mapList){if(clazz == null || CommonUtils.isCollectionEmpty(mapList)){return null;}List list = new ArrayList();for(Map map : mapList){list.add(setBeanValue(clazz, map));}return list;}/** * 获取bean所有字段的json * @param bean * @return */public static JSONObject getBeanJSONObjectByField(Object bean){JSONObject json = new JSONObject();List fieldList = getFieldNameList(bean);if(CommonUtils.isCollectionEmpty(fieldList)){return json;}Object obj = null;for(String field : fieldList){try {obj = getProperty(bean, field);} catch (Exception e) {} json.put(field, obj);}return json;}/** * app获取bean所有字段的json * @param bean * @return */public static JSONObject getBeanJSONObjectByFieldForApp(Object bean){/*Gson gson = new GsonBuilder().serializeNulls().create();String gsonString = gson.toJson(bean);return JSONObject.fromObject(gsonString);*/JSONObject json = new JSONObject();List fieldList = getFieldNameList(bean);if(CommonUtils.isCollectionEmpty(fieldList)){return json;}Object obj = null;for(String field : fieldList){try {obj = getPropertyForApp(bean, field);} catch (Exception e) {} json.put(field, obj);}return json;}/** * 根据JsonConfig,获取bean指定字段的json * @param bean * @param config * @param fields * @return */public static JSONObject getBeanJSONObjectByField(Object bean, JsonConfig config, String ... fields){JSONObject json = JSONObject.fromObject(bean, config);if(CommonUtils.isCollectionEmpty(fields)){return json;}JSONObject retJson = new JSONObject();Object obj = null;for(String field : fields){obj = json.get(field);retJson.put(field, obj);}return retJson;}/** * 获取bean指定字段的json * @param bean * @param fields * @return */public static JSONObject getBeanJSONObjectByField(Object bean, String ... fields){JSONObject json = new JSONObject();if(CommonUtils.isCollectionEmpty(fields)){return json;}Object obj = null;for(String field : fields){try {obj = getProperty(bean, field);} catch (Exception e) {} json.put(field, obj);}return json;}/** * 获取bean所有的get方法的json,key为对应的生成的字段 * @param bean * @return */public static JSONObject getBeanJSONObjectByMethod(Object bean){JSONObject json = new JSONObject();List getMethodList = getGetMethodNameList(bean);if(CommonUtils.isCollectionEmpty(getMethodList)){return json;}Class> clazz = bean.getClass();String key = "";String value = "";MethodAccess access = null;Object obj = null;for(String methodName : getMethodList){key = methodName.substring(3, 4).toLowerCase().concat(methodName.substring(4, methodName.length()));if(StringUtil.isStrEmpty(key)){continue;}access = getCacheMethodAccess(clazz);obj = access.invoke(bean, methodName);if(obj != null && obj instanceof Date){value = StringUtil.getDateString((Date) obj); //除了日期,其他都利用spring的帮助类}else{value = ObjectUtils.getDisplayString(obj); //利用spring的帮助类}json.put(key, value);}return json;}/** * 给JSONObject对应的值增加前缀 * @param json * @param map * @return */public static JSONObject setUpPrefix(JSONObject json, Map map){if(CommonUtils.isCollectionEmpty(map)){return json;}Set keys = map.keySet();Object value = null;for(String key : keys){value = json.get(key);if(value != null && !"".equals(value.toString())){json.put(key, map.get(key) + value);}}return json;}///** * 根据JsonConfig,获取bean list指定字段的JSONArray * @param beanList * @param config * @param fields * @return */public static JSONArray getBeanListJSONArrayByField(List> beanList, JsonConfig config, String ... fields){JSONArray array = new JSONArray();if(CommonUtils.isCollectionEmpty(beanList) || CommonUtils.isCollectionEmpty(fields)){return array;}for(Object bean : beanList){array.add(getBeanJSONObjectByField(bean, config, fields));}return array;}/** * 获取bean list 的JSON数组 * @param beanList * @param fields * @return */public static JSONArray getBeanListJSONArray(List> beanList){JSONArray array = new JSONArray();if(CommonUtils.isCollectionEmpty(beanList)){return array;}for(Object bean : beanList){array.add(JSONObject.fromObject(bean));}return array;}/** * 获取bean list指定字段的JSONArray * @param beanList * @param fields * @return */public static JSONArray getBeanListJSONArrayByField(List> beanList, String ... fields){JSONArray array = new JSONArray();if(CommonUtils.isCollectionEmpty(beanList) || CommonUtils.isCollectionEmpty(fields)){return array;}for(Object bean : beanList){array.add(getBeanJSONObjectByField(bean, fields));}return array;}/** * app获取bean list指定字段的JSONArray * @param beanList * @param fields * @return */public static JSONArray getBeanListJSONArrayByFieldForApp(List> beanList, String ... fields){JSONArray array = new JSONArray();if(CommonUtils.isCollectionEmpty(beanList) || CommonUtils.isCollectionEmpty(fields)){return array;}for(Object bean : beanList){array.add(getBeanJSONObjectByFieldForApp(bean, fields));}return array;}/** * 获取bean list所有的get方法的JSONArray * @param beanList * @return */public static JSONArray getBeanListJSONArrayByMethod(List> beanList){JSONArray array = new JSONArray();if(CommonUtils.isCollectionEmpty(beanList)){return array;}for(Object bean : beanList){array.add(getBeanJSONObjectByField(bean));}return array;}/** * 给JSONArray对应的值增加前缀 * @param array * @param map * @return */public static JSONArray setUpPrefix(JSONArray array, Map map){if(CommonUtils.isCollectionEmpty(map)){return array;}int size = array.size();if(size <= 0){return array;}JSONObject json = null;for(int i=0; i getFieldNameList(Object bean){Class> clazz = bean.getClass();Field[] implFs = clazz.getDeclaredFields(); //实现类,也就是本身的字段List fieldNameList = new ArrayList();String name = "";for(Field fs : implFs){name = fs.getName();if(("serialVersionUID").equalsIgnoreCase(name))continue;fieldNameList.add(name);}return fieldNameList;}/** * 获取所有的方法 * @param name * @return */private static List getGetMethodNameList(Object bean){List getMethodList = new ArrayList();Class> clazz = bean.getClass();Method[] mds = clazz.getMethods();String name = null;for(Method md : mds){name = md.getName();if(name.startsWith("get") && !"getClass".equalsIgnoreCase(name)){getMethodList.add(name);}}return getMethodList;}/** * 因为MethodAccess.get(clazz);比较耗时,所以缓存起来 * @param clazz * @return */private static MethodAccess getCacheMethodAccess(Class> clazz){MethodAccess obj = classMethodAccessMap.get(clazz);if(obj == null){MethodAccess access = MethodAccess.get(clazz);classMethodAccessMap.put(clazz, access);return access;}return obj;}/** * 获取bean指定字段的json * @param bean * @param fields * @return */public static JSONObject getBeanJSONObjectByFieldForApp(Object bean, String ... fields){JSONObject json = new JSONObject();if(CommonUtils.isCollectionEmpty(fields)){return json;}Object obj = null;for(String field : fields){try {obj = getPropertyForApp(bean, field);} catch (Exception e) {} json.put(field, obj);}return json;}/** * app的日期返回long * @param bean * @param field * @return * @throws IllegalAccessException * @throws InvocationTargetException * @throws NoSuchMethodException */private static Object getPropertyForApp(Object bean, String field) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{try{Class> clazz = bean.getClass(); String methodName = "get".concat(field.substring(0, 1).toUpperCase().concat(field.substring(1, field.length())));MethodAccess access = getCacheMethodAccess(clazz);Object obj = access.invoke(bean, methodName);if(obj != null && obj instanceof java.util.Date){obj = new Long(((Date) obj).getTime());}if(obj == null){//获取字段的类型Field _field = clazz.getDeclaredField(field); Class> fieldType = _field.getType(); if(fieldType == Number.class || fieldType.getSuperclass() == Number.class || fieldType == java.util.Date.class || fieldType == java.sql.Date.class){ obj = 0; }else{ obj = ""; }}return obj;}catch (Exception e) {return PropertyUtils.getProperty(bean, field);}}}
66ce73a917bf925c455c081853ed778f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年阿里云采购季大促主会场全攻略

在疫情的影响下&#xff0c;企业都在谋求各种转机&#xff0c;探寻各种转型之路&#xff0c;为助力企业复工复产低成本上云&#xff0c;日前阿里云开年采购季优惠活动于3月1日正式开启。 从主会场页面来看&#xff0c;活动分为三个阶段&#xff1a; 3月1日-3月16日&#xff1a…

应云而生,幽灵的威胁 - 云原生应用交付与运维的思考

简介&#xff1a; 过去的 2020 是充满不确定性的一年&#xff0c;但也是充满机遇的一年。突发的新冠疫情为全社会的数字化转型按下加速键。云计算已经不再是一种技术&#xff0c;而是成为支撑数字经济发展和业务创新的关键基础设施。在利用云计算重塑企业 IT 的过程中&#xff…

技术干货 | mPaaS 小程序高玩带你起飞:客户端预置小程序无视网络质量

简介&#xff1a; 弱网拉包无障碍&#xff0c;深度提升用户体验 传统的小程序技术容易受到网络环境影响&#xff0c;当网络质量不佳时可能导致拉取不到小程序包的情况。通过预置小程序&#xff0c;即可规避该问题。本文介绍了预置小程序的原理和预置小程序的实现过程。 什么是预…

Delta Lake在Soul的应用实践

简介&#xff1a; 传统离线数仓模式下&#xff0c;日志入库前首要阶段便是ETL&#xff0c;我们面临如下问题&#xff1a;天级ETL任务耗时久&#xff0c;影响下游依赖的产出时间&#xff1b;凌晨占用资源庞大&#xff0c;任务高峰期抢占大量集群资源&#xff1b;ETL任务稳定性不…

亚马逊云科技中国线上峰会开幕,发力汽车产业链、少年人工智能等

亚马逊云科技于9月9日-14日举办以“构建新格局 重塑云时代”为主题的中国线上峰会&#xff0c;推出涵盖行业视野、技术创新、开发者和开源、云安全、以及人工智能的5大主题演讲、覆盖云计算各细分领域的8大技术分论坛&#xff0c;以及汇聚各行业上云趋势及创新实践的10大行业分…

【产品能力深度解读】连续入围Gartner魔力象限的Quick BI有何魔力?

简介&#xff1a; 国际权威分析机构Gartner发布2021年商业智能和分析平台魔力象限报告&#xff0c;阿里云Quick BI再度入选&#xff0c;并继续成为该领域魔力象限唯一入选的中国企业。 Quick BI凭借在增强分析能力上的持续投入、数据中台矩阵化产品优势和电商行业的专业度&…

mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

《Mysql实例详解Mysql中的JSON系列操作函数》要点&#xff1a;本文介绍了Mysql实例详解Mysql中的JSON系列操作函数&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。MYSQL必读前言MYSQL必读JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,…

256变4096:分库分表扩容如何实现平滑数据迁移?

简介&#xff1a; 本文作者就一个高德打车弹外订单系统进行了一次扩分库分表和数据库迁移。 一、 背景 2020年&#xff0c;笔者负责的一个高德打车弹外订单系统进行了一次扩分库分表和数据库迁移。该订单系统整体部署在阿里云上&#xff0c;服务使用阿里云ECS部署&#xff0c;…

OpenYurt 如何 “0 侵入” 攻破云边融合难点

简介&#xff1a; 随着 5G、IoT、直播、CDN 等行业和业务的发展&#xff0c;越来越多的算力和业务开始下沉到距离数据源或者终端用户更近的位置&#xff0c;以期获得很好的响应时间和成本&#xff0c;这是一种明显区别于传统中心模式的计算方式——边缘计算。 随着 5G、IoT、直…

Python - 深夜数据结构与算法之 Graph

目录 一.引言 二.图的简介 1.Graph 图 2.Undirected graph 无向图 3.Directed Graph 有向图 4.DFS / BFS 遍历 三.经典算法实战 1.Num-Islands [200] 2.Land-Perimeter [463] 3.Largest-Island [827] 四.总结 一.引言 Graph 无论是应用还是算法题目在日常生活中比较…

Docker Desktop宣布收费;腾讯7月已申请注册WECHAT CLOUD商标;MongoDB成为当前最具价值开源软件公司...

NEWS本周新闻回顾Docker Desktop 宣布收费近日 Docker 官方宣布一项新的动作&#xff0c;即将产品订阅划分为个人、专业、团队和商业不同版本。如果企业规模在 250 名员工以上或年收入超过 1000 万美元的公司想要使用 Docker Desktop&#xff0c;那么必须使用付费订阅。付费订阅…

Serverless 2.0,鸡蛋还是银弹?

简介&#xff1a; 本篇旨在介绍 Serverless 如今应用到应用&#xff08;非病句&#xff09;的各种困境&#xff0c;以及帮助用户如何去规避一些问题&#xff0c;提前了解方向。 浪潮 从 2014 年 Serverless 冒头至今&#xff0c;已经有无数的勇士在前面探路&#xff0c;阿里、…

基础组件完善的今天,如何通过业务组件提效?

简介&#xff1a; 无论是在前端刀耕火种的 jQuery/YUI 时代&#xff0c;还是到现在基于数据驱动 UI 的 React/Vue 时代&#xff0c;物料/组件一直是前端永恒的话题。基于大量重复逻辑的封装可以很显而易见地提升前端 UI 的构建效率&#xff0c;简单而直接&#xff0c;因此无论技…

​做安全操作系统,这位技术老兵是认真的!

受访者 | 王文东记者 | 伍杏玲出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;近年来国际形势变化莫测&#xff0c;基础软件作为建设国家信息系统的核心&#xff0c;其自主研发能力备受关注与热议。作为企业和个人开发者&#xff0c;我们如何打破当前国产基…

基于 Flink SQL 构建流批一体的 ETL 数据集成

简介&#xff1a; 如何利用 Flink SQL 构建流批一体的 ETL 数据集成。 本文整理自云邪、雪尽在 Flink Forward Asia 2020 的分享&#xff0c;该分享以 4 个章节来详细介绍如何利用 Flink SQL 构建流批一体的 ETL 数据集成, 文章的主要内容如下&#xff1a; 数据仓库与数据集成…

入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?

简介&#xff1a; 本文除了介绍RobustPeriod的核心技术亮点&#xff0c;还将重点解释如何将它构筑成服务来解决阿里云的业务痛点。 近日&#xff0c;由阿里云计算平台和阿里云达摩院合作的时序多周期检测相关论文RobustPeriod: Robust Time-Frequency Mining for Multiple Peri…

《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

20年前&#xff0c;伴随着互联网打开信息化大门&#xff0c;技术人成为新时代的开拓者。在时代的召唤下&#xff0c;CSDN于2001年推出国内首个面向IT人员的专业杂志——《程序员》&#xff0c;成为一代代开发者的技术启蒙。20年后的今天&#xff0c;人工智能、云计算、大数据等…

Kubernetes 稳定性保障手册 -- 极简版

简介&#xff1a; Kubernetes 在生产环境中的采用率越来越高&#xff0c;复杂度越来越高&#xff0c;由此带来的稳定性保障的挑战越来越大。 Kubernetes 在生产环境中的采用率越来越高&#xff0c;复杂度越来越高&#xff0c;由此带来的稳定性保障的挑战越来越大。 对于基于 K…

收藏!这些IDE使用技巧,你都知道吗

简介&#xff1a; 欲善其事&#xff0c;先利其器。对于研发同学&#xff0c;在日常的开发工作中&#xff0c;我们与之打交道最多的便是编程的IDE。能否高效和灵活的使用IDE&#xff0c;将对我们的工作效率起着举足轻重的作用。 一 、背景 1 、目的 欲善其事&#xff0c;先利其…

做安全操作系统,这位技术老兵是认真的!

受访者 | 王文东 记者 | 伍杏玲 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 近年来国际形势变化莫测&#xff0c;基础软件作为建设国家信息系统的核心&#xff0c;其自主研发能力备受关注与热议。作为企业和个人开发者&#xff0c;我们如何打破当前…