相对强大的反射工具类

1.针对场景,反射执行方法或者获取属性中,有时候需要去查找到父类的方法或者属性,该工具类可以查找父类的方法和属性
依赖工具类
java反射包

reflections-0.10.2.jar
package com.mes.util.common;

import org.reflections.Reflections;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 反射工具类
 *
 * @author xuweijun
 * @date 2022/5/16
 */
public class ReflectUtilsEx {
    /**
     * 执行方法
     * @author xuweijun
     * @date 2022/5/16 14:00
     * @param object
     * @param clazz
     * @param methodName
     * @param parameterTypes
     * @param args
     * @return java.lang.Object
     */
    public static Object invokMethod(final Object object,final Class<?> clazz, final String methodName, final Class<?>[] parameterTypes, final Object[] args) {
        try {
            Method declaredMethod = clazz.getDeclaredMethod(methodName, parameterTypes);
            declaredMethod.setAccessible(true);
            return declaredMethod.invoke(object, args);
        } catch (Exception e) {
            if (e instanceof NoSuchMethodException) {
                Class<?> superclass = clazz.getSuperclass();
                if (null == superclass) {
                    return null;
                }
                return invokMethod(object,superclass,methodName,parameterTypes,args);
            } else {
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 获取属性
     * @author xuweijun
     * @date 2022/5/16 14:00
     * @param object
     * @param clazz
     * @param fname
     * @return java.lang.Object
     */
    public static Object getObjByField(Object object, Class<?> clazz, final String fname) {
        try {
            final Field field = clazz.getDeclaredField(fname);
            field.setAccessible(true);
            return field.get(object);
        } catch (Exception e) {
            if (e instanceof NoSuchFieldException) {
                Class<?> superclass = clazz.getSuperclass();
                if (null == superclass) {
                    return null;
                }
                return getObjByField(object,superclass,fname);
            } else {
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 设置属性值
     * @author xuweijun
     * @date 2022/6/11 09:23
     * @param object
     * @param clazz
     * @param fName
     * @param fValue
     * @return void
     */
    public static void setObjFieldValue(Object object, Class<?> clazz, final String fName,final Object fValue) {
        try {
            final Field field = clazz.getDeclaredField(fName);
            field.setAccessible(true);
            field.set(object,fValue);
        } catch (Exception e) {
            if (e instanceof NoSuchFieldException) {
                Class<?> superclass = clazz.getSuperclass();
                if (null == superclass) {
                    return ;
                }
                setObjFieldValue(object,superclass,fName,fValue);
            } else {
                e.printStackTrace();
            }
        }
        return;
    }
    /**
     * Object对象转换成目标对象
     * @author xuweijun
     * @date 2022/7/7 09:07
     * @param fromValue
     * @param toValueType
     * @return T
     */
    public static <T> T convertValue(Object fromValue, Class<T> toValueType) throws IllegalArgumentException {
        return (T) fromValue;
    }
    /**
     * 获得接口的实现类实例,从结果上类似与Spring的接口实例化
     * @author xuweijun
     * @date 2022/7/7 09:07
     * @param clazz
     * @return java.util.Map<java.lang.String,T>
     */
    public static <T> Map<String, T> getSubTypeMap(Class<T> clazz) {
        Reflections reflections = new Reflections(clazz.getPackage().getName());
        Set<Class<? extends T>> subTypesOf = reflections.getSubTypesOf(clazz);
        Map<String, T> collect = subTypesOf.stream().collect(Collectors.toMap(k -> k.getName(), v -> {
            try {
                return v.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }));
        return collect;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JerryLXu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值