java反射的一些工具方法

java反射的一些工具方法

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.Set;

/**
 * 反射的工具类
 * @author xx
 * @date 2022/10/9 9:56
 */
public class ReflectUtil {

    private static final Logger log = LoggerFactory.getLogger(ReflectUtil.class);

    /**
     * 根据参数创建一个新的对象,其余的默认值
     * @param t1
     * @param keys
     * @param <T>
     * @return
     */
    public static <T> T createNewByKeys(T t1, Set<String> keys){
        try {
            T t = (T) createByType(t1.getClass());
            Object val;
            for (String key : keys) {
                //先从原始对象里面获取值
                val = getByName(t1, key);
                //再塞到新的对象里面
                setByName(t, key, val);
            }
            return t;
        } catch (Exception e) {
            log.error("创建新对象异常", e);
        }
        return null;
    }

    /**
     * 通过属性名称获取值
     * @param t
     * @param name
     * @param <T>
     * @return
     */
    public static <T> Object getByName(T t, String name) {
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        //处理..形式的属性名称
        String[] arr = name.split("\\.");
        Object obj = t;
        for (String s : arr) {
            obj =  getByAttr(obj, s);
            if (obj == null) {
                break;
            }
        }
        return obj;
    }

    /**
     * 通过属性名称设置新的值
     * @param t
     * @param name
     * @param val
     * @param <T>
     */
    public static <T> void setByName(T t, String name, Object val){
        if (StringUtils.isEmpty(name)) {
            return;
        }
        //处理..形式的属性名称
        String[] arr = name.split("\\.");
        Object obj = t;
        Object newObj;
        Class tClass;
        if (arr.length > 1) {
            for (int i = 0; i < arr.length - 1; i++) {
                newObj = getByAttr(obj, arr[i]);
                if (newObj == null) {
                    tClass = getTypeByName(obj, arr[i]);
                    if (tClass == null) {
                        break;
                    }
                    newObj = createByType(tClass);
                    if (newObj == null) {
                        break;
                    }
                    setByAttr(obj, arr[i], newObj);
                }
                obj = newObj;
            }
        }
        //最后把最底层的值塞进去
        setByAttr(obj, arr[arr.length - 1], val);
    }

    /**
     * 根据类型创建对象
     * @param tClass
     * @return
     */
    public static <T> T createByType(Class<T> tClass){
        try {
            //调用无参构造器创建对象
            return tClass.newInstance();
        } catch (Exception e) {
            log.error("根据类型创建对象异常", e);
        }
        return null;
    }

    /**
     * 最底层的根据属性名称设置值的方法,最纯粹的属性
     * @param t
     * @param name
     * @param value
     * @param <T>
     */
    private static <T> void setByAttr(T t, String name, Object value) {
        if (t == null || StringUtils.isEmpty(name)) {
            return;
        }
        Field field = null;
        try {
            //只获取本类的属性
            field = t.getClass().getDeclaredField(name);
            field.setAccessible(true);
            field.set(t, value);
        } catch (Exception e) {
            log.error("反射设置值异常", e);
        } finally {
            if (field != null) {
                field.setAccessible(false);
            }
        }
    }

    /**
     * 获取属性类型
     * @param t
     * @param name
     * @param <T>
     * @return
     */
    private static <T> Class getTypeByName(T t, String name){
        try {
            Field field = t.getClass().getDeclaredField(name);
            return field.getType();
        } catch (Exception e) {
            log.error("获取属性类型异常", e);
        }
        return null;
    }

    /**
     * 最底层的根据属性名称获取数据,最纯粹的属性
     * @param t
     * @param name
     * @param <T>
     * @return
     */
    private static <T> Object getByAttr(T t, String name) {
        if (t == null || StringUtils.isEmpty(name)) {
            return null;
        }
        Field field = null;
        try {
            //只获取本类的属性
            field = t.getClass().getDeclaredField(name);
            field.setAccessible(true);
            return field.get(t);
        } catch (Exception e) {
            log.error("反射获取值异常", e);
        } finally {
            if (field != null) {
                field.setAccessible(false);
            }
        }
        return null;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java反射是一种强大的机制,可以通过它来获取类信息、访问和修改类中的字段、调用类中的方法等。然而,使用Java反射可能会比直接调用类方法更加复杂,因为它需要编写更多的代码和进行更多的异常处理。为了简化Java反射的使用,可以使用一些高效的Java反射通用工具。 以下是一些高效的Java反射通用工具: 1. Apache Commons BeanUtils:Apache Commons BeanUtils提供了许多工具类,可以用来访问和修改JavaBean中的属性。它可以实现将一个JavaBean转换成另一个JavaBean,或者将JavaBean的属性值复制到另一个JavaBean中。 2. Spring Framework的反射工具类:Spring Framework提供了一个ReflectionUtils类,用于封装Java反射的常见操作。它提供了一些便捷的方法来访问和修改Java类中的字段和方法,如获取所有字段、获取所有方法获取方法参数类型等。 3. Google Guava的反射工具类:Google Guava库提供了一个Reflection类,它提供了一些简单而强大的工具,可以用于访问和修改Java类中的字段和方法。它可以检查字段是否是可访问的、获取方法的返回类型、获取方法的参数类型等。 4. Javassist:Javassist是一个Java字节码编辑器,它可以用于在运行时修改Java类的字节码。它提供了一些工具类,可以用于访问和修改Java类的字段和方法。它可以在运行时动态地生成新的类、修改类的字段和方法等。 这些工具可以帮助开发人员更加高效地使用Java反射,从而减少代码量、提高代码可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值