All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tlgen.orm.utils.ReflectUtils Maven / Gradle / Ivy

The newest version!
package com.tlgen.orm.utils;

import com.tlgen.orm.function.TypeFunction;

import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射工具类
 */
public class ReflectUtils {

    /**
     * 获取已有对象的属性值
     *
     * @param obj
     * @param fieldName
     * @return
     */
    public static Object getFieldValue(Object obj, String fieldName) {
        // 1.根据属性名称就可以获取其get方法
        String getMethodName = "get"
                + fieldName.substring(0, 1).toUpperCase()
                + fieldName.substring(1);
        try {
            // get 方法都是 public 的且无参数
            Method m= obj.getClass().getMethod(getMethodName);
            //3 通过方法的反射操作方法
            Object value = m.invoke(obj);
            return value;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据对象的属性名获取其属性值
     * @param clazz
     * @param fieldName
     * @return
     */
    public static String getFieldValue(Class clazz, String fieldName) {
        // 1.根据属性名称就可以获取其get方法
        String getMethodName = "get"
                + fieldName.substring(0, 1).toUpperCase()
                + fieldName.substring(1);
        Object obj = null;
        try {
            Class aClass = Class.forName(clazz.getName());
            try {
                obj = aClass.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            // get 方法都是 public 的且无参数
            Method m= clazz.getMethod(getMethodName);
            //3 通过方法的反射操作方法
            Object value = m.invoke(obj);
            return String.valueOf(value);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 根据类型和属性名创建 Field 对象
     * @param clazz
     * @param fieldName
     * @return
     */
    public static Field getFiledInstance(Class clazz, String fieldName) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            return field;
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据类型获取类的名称
     * @param clazz
     * @return
     */
    public static String getClassName(Class clazz) {
        String name = clazz.getName();
        String[] strings = name.split("\\.");
        return strings[strings.length - 1];
    }

    /**
     * 将 bean 的属性的 get 方法, 作为 lambda 表达式传入时, 获取 get 方法对应的属性 Field
     *
     * @param fn  lambda 表达式, bean 的属性的 get 方法
     * @param  泛型
     * @return 属性对象
     */
    public static  String getLambdaFieldName(TypeFunction fn) {
        // 从function取出序列化方法
        Method writeReplaceMethod;
        try {
            writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace");
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }

        // 从序列化方法取出序列化的lambda信息
        boolean isAccessible = writeReplaceMethod.isAccessible();
        writeReplaceMethod.setAccessible(true);
        SerializedLambda serializedLambda;
        try {
            serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn);
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        writeReplaceMethod.setAccessible(isAccessible);

        // 从lambda信息取出method、field、class等
        String implMethodName = serializedLambda.getImplMethodName();
        // 确保方法是符合规范的get方法,boolean类型是is开头
        if (!implMethodName.startsWith("is") && !implMethodName.startsWith("get")) {
            throw new RuntimeException("get 方法名称: " + implMethodName + ", 不符合 java bean 规范");
        }

        // get方法开头为 is 或者 get,将方法名 去除is或者get,然后首字母小写,就是属性名
        int prefixLen = implMethodName.startsWith("is") ? 2 : 3;

        String fieldName = implMethodName.substring(prefixLen);
        String firstChar = fieldName.substring(0, 1);
        fieldName = fieldName.replaceFirst(firstChar, firstChar.toLowerCase());
        Field field;
        try {
            field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName);
        } catch (ClassNotFoundException | NoSuchFieldException e) {
            throw new RuntimeException(e);
        }

        return field.getName();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy