java ClassUtil 反射工具类

常用java反射工具类

ppackage com.gentlesoft.ecm.sys;


import cn.hutool.core.util.ObjectUtil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;

public class ClassUtils {

    /**
     * 取对象全部属性名
     *
     * @param o 对象
     * @return
     */
    public static String[] getFiledName(Object o) {
        Field[] fields = o.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
            fieldNames[i] = fields[i].getName();
        }
        return fieldNames;
    }

    /**
     * 根据属性名获取值
     *
     * @param fieldName
     * @param o
     * @return
     */
    public static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[]{});
            Object value = method.invoke(o, new Object[]{});
            return value;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 根据属性名称和对象转化成对应的值
     *
     * @param bean     对象
     * @param property 属性名称
     * @param var      原始值
     * @return
     */
    public static Object convertValueByPropertyAndObjcet(Object bean, String property, Object var) {
        try {
            String value = var.toString();
            Class<?> cls = bean.getClass();
            Field field = cls.getDeclaredField(property);
            String type = field.getType().getSimpleName();
            if (null != type && !"".equals(type) && null != value && !"".equals(value)) {
                if ("String".equals(type)) {
                    return value;
                } else if ("Date".equals(type)) {
                    return parseDate(value);
                } else if ("Integer".equals(type) || "int".equals(type)) {
                    return Integer.parseInt(value);
                } else if ("Long".equalsIgnoreCase(type)) {
                    return Long.parseLong(value);
                } else if ("Double".equalsIgnoreCase(type)) {
                    return Double.parseDouble(value);
                } else if ("Boolean".equalsIgnoreCase(type)) {
                    return Boolean.parseBoolean(value);
                } else {
                    return new NullPointerException("not supper type" + type);
                }
            } else {
                return new NullPointerException("Object does not have this property:" + property);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return e;
        }
    }

    /**
     * 为对象属性赋值
     *
     * @param bean   对象
     * @param valMap map:键—属性名,值-属性值
     */
    public static void setFieldValue(Object bean, Map<String, String> valMap) {
        Class<?> cls = bean.getClass();
        // 取出bean里的所有方法
        Method[] methods = cls.getDeclaredMethods();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            try {
                String fieldSetName = parSetName(field.getName());
                if (!valMap.containsKey(field.getName())) {
                    continue;
                }
                if (!checkSetMet(methods, fieldSetName)) {
                    continue;
                }
                Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());
                String value = valMap.get(field.getName());
                if (null != value && !"".equals(value)) {
                    String fieldType = field.getType().getSimpleName();
                    setValue(fieldType, fieldSetMet, bean, value);
                }
            } catch (Exception e) {
                continue;
            }
        }

    }

    /**
     * 根据属性给对象赋值
     *
     * @param bean      对象
     * @param fieldName 属性名
     * @param var       值
     */
    public static void setFieldValueByFieldName(Object bean, String fieldName, Object var) {
        try {
            boolean falg = null != var && !var.equals(null);
            if (falg) {
                Class<?> cls = bean.getClass();
                Field field = cls.getDeclaredField(fieldName);
                Method fieldSetMet = cls.getMethod(parSetName(fieldName), field.getType());
                String fieldType = field.getType().getSimpleName();
                if (null != fieldType && !"".equals(fieldType)) {
                    setValue(fieldType, fieldSetMet, bean, var);
                } else {
                    new NullPointerException("Object does not have this property:" + fieldName);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 格式化string为Date
     *
     * @param datestr
     * @return date
     */
    public static Date parseDate(String datestr) {
        if (null == datestr || "".equals(datestr)) {
            return null;
        }
        try {
            String fmtstr = null;
            if (datestr.indexOf(':') > 0) {
                fmtstr = "yyyy-MM-dd HH:mm:ss";
            } else {
                fmtstr = "yyyy-MM-dd";
            }
            SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);
            return sdf.parse(datestr);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 日期转化为String
     *
     * @param date
     * @return date string
     */
    public static String fmtDate(Date date) {
        if (null == date) {
            return null;
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
            return sdf.format(date);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 判断是否存在某属性的 set方法
     *
     * @param methods
     * @param fieldSetMet
     * @return boolean
     */
    public static boolean checkSetMet(Method[] methods, String fieldSetMet) {
        for (Method met : methods) {
            if (fieldSetMet.equals(met.getName())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否存在某属性的 get方法
     *
     * @param methods
     * @param fieldGetMet
     * @return boolean
     */
    public static boolean checkGetMet(Method[] methods, String fieldGetMet) {
        for (Method met : methods) {
            if (fieldGetMet.equals(met.getName())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 拼接某属性的 get方法
     *
     * @param fieldName
     * @return String
     */
    public static String parGetName(String fieldName) {
        if (null == fieldName || "".equals(fieldName)) {
            return null;
        }
        return "get" + fieldName.substring(0, 1).toUpperCase()
                + fieldName.substring(1);
    }

    /**
     * 拼接在某属性的 set方法
     *
     * @param fieldName
     * @return String
     */
    public static String parSetName(String fieldName) {
        if (null == fieldName || "".equals(fieldName)) {
            return null;
        }
        return "set" + fieldName.substring(0, 1).toUpperCase()
                + fieldName.substring(1);
    }

    /**
     * 根据属性字段类型设置属性值
     *
     * @param fieldType
     * @param fieldSetMet
     * @param bean
     * @param var
     */
    public static void setValue(String fieldType, Method fieldSetMet, Object bean, Object var) {
        try {
            switch (fieldType) {
                case "String":
                    fieldSetMet.invoke(bean, var.toString());
                    break;
                case "Date":
                    Date date = parseDate(var.toString());
                    fieldSetMet.invoke(bean, date);
                    break;
                case "Integer":
                    Integer integerval = Integer.parseInt(var.toString());
                    fieldSetMet.invoke(bean, integerval);
                    break;
                case "int":
                    Integer intval = Integer.parseInt(var.toString());
                    fieldSetMet.invoke(bean, intval);
                    break;
                case "Long":
                    Long longval = Long.parseLong(var.toString());
                    fieldSetMet.invoke(bean, longval);
                    break;
                case "Double":
                    Double doubleval = Double.parseDouble(var.toString());
                    fieldSetMet.invoke(bean, doubleval);
                    break;
                case "Boolean":
                    Boolean booleanval = Boolean.parseBoolean(var.toString());
                    fieldSetMet.invoke(bean, booleanval);
                    break;
                case "BigDecimal":
                    BigDecimal decimal = new BigDecimal(var.toString());
                    fieldSetMet.invoke(bean, decimal);
                    break;
                case "Float":
                    Float flolt = Float.parseFloat(var.toString());
                    fieldSetMet.invoke(bean, flolt);
                    break;
                default:
                    new NullPointerException("not supper type" + fieldType);
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

<think>好的,用户现在想查找关于Java Spring框架中反射工具类的相关信息和使用示例。首先,我需要回忆一下Spring框架中有哪些与反射相关的工具类。记得Spring有一个核心包org.springframework.util,里面包含了很多实用工具类,比如ReflectionUtils和MethodIntrospector。这些类应该就是用户需要的反射工具类。 接下来,要确定用户的使用场景。可能用户需要在项目中进行动态方法调用、处理注解或者进行反射操作时的异常处理。比如,他们可能想动态地获取某个类的方法,或者执行私有方法进行测试,或者查找带有特定注解的方法。这时候,ReflectionUtils提供的方法就能派上用场。 然后,我需要整理这些工具类的常用方法,并给出具体的示例代码。比如,ReflectionUtils的doWithMethods方法可以用来遍历类的方法,MethodIntrospector.selectMethods可以用于根据条件筛选方法。还有处理异常时的convertReflectionExceptionToUnchecked方法,这能帮助用户避免繁琐的try-catch块。 同时,用户可能关心这些工具类在实际开发中的应用场景,比如在AOP中处理代理对象,或者在测试中调用私有方法。需要结合这些场景给出例子,让用户更容易理解如何应用。 另外,要注意引用Spring的官方文档或可靠的资料来支持回答,比如引用中提到Spring的BeanUtil和反射工具类的使用,可能需要参考引用[2]和[3]中的相关内容,但用户提供的引用似乎更多关于BeanUtils而不是反射工具类,所以可能需要调整引用来源,或者直接引用Spring官方文档。 最后,生成的相关问题需要围绕反射工具类的扩展应用、异常处理、与其他工具类的对比以及性能分析,这样用户可以有更深入的学习路径。需要确保问题具有针对性,帮助用户进一步探索。</think>在Spring Framework中,反射工具类主要集中在`org.springframework.util`包的$ReflectionUtils$和$MethodIntrospector$类中,以下是具体使用示例和场景分析: ### 一、ReflectionUtils 核心方法 ```java // 查找指定类中所有声明方法 ReflectionUtils.doWithMethods(TargetClass.class, method -> { System.out.println("发现方法: " + method.getName()); }, methodFilter -> !methodFilter.isSynthetic()); // 执行私有方法示例 Method privateMethod = ReflectionUtils.findMethod(TargetClass.class, "hiddenMethod", String.class); ReflectionUtils.makeAccessible(privateMethod); Object result = ReflectionUtils.invokeMethod(privateMethod, targetInstance, "参数值"); ``` ### 二、MethodIntrospector 方法探测 ```java // 查找带特定注解的方法 Map<Method, MyAnnotation> annotatedMethods = MethodIntrospector.selectMethods( ServiceComponent.class, (MethodIntrospector.MetadataLookup<MyAnnotation>) method -> AnnotatedElementUtils.findMergedAnnotation(method, MyAnnotation.class) ); ``` ### 三、反射异常处理 ```java try { Field field = ReflectionUtils.findField(Target.class, "privateField"); } catch (IllegalStateException ex) { throw ReflectionUtils.convertReflectionExceptionToUnchecked(ex); } ``` ### 四、典型应用场景 1. **AOP代理处理**:解析代理对象的目标方法 ```java Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass); ``` 2. **测试工具**:访问私有成员进行单元测试 3. **注解处理器**:扫描框架中带有特定注解的方法 4. **动态配置**:运行时根据条件动态调用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值