首页 > 其他分享 >反射工具类

反射工具类

时间:2023-11-25 20:22:17浏览次数:25  
标签:反射 return String param fieldName obj 工具 cls

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public final class ReflectUtil {
    private ReflectUtil() {
    }

    /**
     * 获取SET方法
     *
     * @param fieldName
     * @param cls
     * @return
     */
    public static Method getSetter(String fieldName, Class<?> cls) {
        for (Method method : cls.getMethods()) {
            if (method.getName().equalsIgnoreCase("set".concat(fieldName)) && method.getParameterTypes().length == 0) {
                return method;
            }
        }
        return null;
    }

    /**
     * 获取GET方法
     *
     * @param fieldName
     * @param cls
     * @return
     */
    public static Method getGetter(String fieldName, Class<?> cls) {
        for (Method method : cls.getMethods()) {
            if (method.getName().equalsIgnoreCase("get".concat(fieldName)) && method.getParameterTypes().length == 0) {
                return method;
            }
        }
        return null;
    }

    /**
     * 给对象某属性赋值
     *
     * @param fieldName
     * @param obj
     * @return
     * @throws ReflectiveOperationException
     */
    public static Object setValueBySetter(String fieldName, Object obj) throws ReflectiveOperationException {
        Method setter = getSetter(fieldName, obj.getClass());
        if (setter == null) {
            throw new ReflectiveOperationException("没有set方法");
        }

        return setter.invoke(obj);
    }

    /**
     * 获取某属性的值
     *
     * @param fieldName
     * @param obj
     * @return
     * @throws ReflectiveOperationException
     */
    public static Object getValueByGetter(String fieldName, Object obj) throws ReflectiveOperationException {
        Method getter = getGetter(fieldName, obj.getClass());
        if (getter != null) {
            return getter.invoke(obj);
        }

        return null;
    }

    /**
     * 获取字段对应值,并转为String类型,空值返回空字符串
     *
     * @param fieldName
     * @param obj
     * @return
     * @throws ReflectiveOperationException
     */
    public static String getStringValue(String fieldName, Object obj) throws ReflectiveOperationException {
        Object objectValue = getValueByGetter(fieldName, obj);
        if (objectValue == null) {
            return "";
        }
        String result = objectValue.toString();
        //如果类型为BigDecimal,去掉末尾的0
        if (objectValue instanceof BigDecimal) {
            BigDecimal value = (BigDecimal) objectValue;
            value = value.stripTrailingZeros();
            result = value.toPlainString();
        } else if (objectValue instanceof Date) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            result = sdf.format((Date) objectValue).replace(" 00:00:00", "");
        }
        return result.trim();
    }

    /**
     * 对象是否存在某属性
     *
     * @param fieldName
     * @param cls
     * @return
     */
    public static boolean fieldExist(String fieldName, Class<?> cls) {
        return getFieldByName(fieldName, cls) != null;
    }

    /**
     * 通过对象.class获取所有Fields,包括父类
     *
     * @param cls
     * @return
     */
    public static List<Field> listFields(Class<?> cls) {
        Field[] fs = cls.getDeclaredFields();
        List<Field> fields = new ArrayList<>(Arrays.asList(fs));
        if (cls.getSuperclass() != null) {
            fields.addAll(listFields(cls.getSuperclass()));
        }
        return fields;
    }

    /**
     * 通过属性名获取Field对象
     *
     * @param fieldName
     * @param cls
     * @return
     */
    public static Field getFieldByName(String fieldName, Class<?> cls) {
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            if (field.getName().equals(fieldName)) {
                return field;
            }
        }

        if (cls.getSuperclass() != null) {
            return getFieldByName(fieldName, cls.getSuperclass());
        }

        return null;
    }
}

 

标签:反射,return,String,param,fieldName,obj,工具,cls
From: https://www.cnblogs.com/xfeiyun/p/17855996.html

相关文章

  • 推特批量关注工具
    《推特批量关注工具:便利与道德考量》 随着社交媒体的普及,推特作为全球最受欢迎的社交平台之一,已经成为人们交流、分享和获取信息的重要渠道。然而,对于个人用户和企业来说,积极地扩大关注者群体往往是一个具有挑战性的任务。在这样的情况下,一些推特批量关注工具应运而生,它们被设......
  • AI创作工具:Claude2注册保姆级教程
    最近软件打算多接入几个AI写作平台,包括讯飞星火,百度文心,Claude2,这样就能给用户提供更多的写作选择经过半天的调研,讯飞星火,百度文心一言,接入都比较简单,毕竟是国内的。在调研Claude2的时候,发现自己之前注册的账号被封了。于是打算重新注册一个账号,结果犯了难。下面开始正式教程......
  • Linux下通过串口工具发送16进制消息
    Linux下常用的串口工具有:1)minicom,最常用的命令行串口工具,可以支持16进制显示信息,但是无法通过16进制进行消息收发;2)cutecom,一款基于QT的带有图形界面的小工具,支持通过16进制进行消息收发(见下图);3)putty,也是一款带有图形界面的工具(没测试,应该也是可以支持16进制通讯的)。 ......
  • 【硬件相关】SPECpower能效评估工具
     一、前言1、软件说明官网:SERT®套件用户指南2.0.5SPECpower介绍SPEC基准及工具SPECpower_ssj2008测试结果SPECpower_ssj2008-Design_ccs-SPECSPEC(theStandardPerformanceEvaluationCorporation)是一个由计算机硬件厂商、软件公司、大学、研究机构、系统集......
  • 工具 | Vshell使用入门
    写在前面   "Vshell是一款go编写的主机群管理工具(RAT)"。    发现Vshell作者团队非常低调,项目Github上Readme介绍非常简短,网上也很少有使用介绍。写个基础入门,记录从配置到主机管理、搭建隧道。本文仅作为工具介绍,请勿用于任何违法场景。    未经授权请勿利用文章......
  • Java 反射+递归 实现数据聚合发布的配置化
    大致是GraphQL的思路分开配置接口数据结构和数据实体的元数据支持列表查询,支持多层级的数据聚合参数选叶子节点就行,后续可以把参数用JS实现一个选择树状结构的UI,生成出查询字符串来,或者按照字段分配权限给租户异常处理的不太好,有待继续调试不支持数据权限,只支持根据聚合根向......
  • 一些方便的webassembly 工具
    WebAssembly团队提供了一些方便的webassembly工具集包含的工具集wat2wasm 将WebAssembly文本格式(.wat)转换为WebAssembly二进制格式(.wasm)wasm2wat 是wat2wasm的反向工具,将二进制格式转换回文本格式(.wat)wasm-objdump 类似于传统的objdump工具,它打印有关WebAssembly二进制......
  • MAT工具分析Dump文件(大对象定位)
     前段时间线上服务经常发生卡顿,经过排查发现是大对象引起的Fullgc问题,特此记录排查逻辑。 目录目的一、获得服务进程二、生成dump文件三、下载mat工具四、使用mat工具导入第二步生成的dump文件五、导入后得到如下界面六、定位大对象(方法一)七、定位大对象(方法二)......
  • Python编写排班工具
    使用Python编写排班小工具:importdatetimedefgenerate_schedule(start_date,end_date,shifts):schedule={}current_date=start_datewhilecurrent_date<=end_date:day_of_week=current_date.strftime("%A")schedule[curre......
  • Apache Bench(ab 压力测试工具)的安装与使用
    1.ab安装下面介绍在liunx和windows上的安装1.1、linux yum 安装yuminstallhttpd-tools或者yum-yinstallhttpd-tools测试安装是否成功:[root@vichtml]#ab-VThisisApacheBench,Version2.3<$Revision:655654$>Copyright1996AdamTwiss,Zeus......