1、两个序列化的函数式接口 MConsumer和MFunction



import java.io.Serializable;
import java.util.function.Consumer;

@FunctionalInterface
public interface MConsumer<T> extends Consumer<T>, Serializable {

}
import java.io.Serializable;
import java.util.function.Function;

@FunctionalInterface
public interface MFunction<T, R> extends Function<T, R>, Serializable {

}

2、LambdaUtil获取字段名和方法名称的工具类

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.property.PropertyNamer;

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

@Slf4j
public class LambdaUtil {

    /**
     * @param serializedLambda 函数式接口的Lambda表达式
     * @return 字段名
     */
    public static String getColumn(SerializedLambda serializedLambda) {
        return PropertyNamer.methodToProperty(serializedLambda.getImplMethodName());
    }

    /**
     * 获取到序列化SerializedLambda
     *
     * @param func 方法
     * @param <T>  泛型T
     * @param <R>  泛型R
     * @return SerializedLambda
     */
    @SneakyThrows
    public static <T, R> SerializedLambda getSerializedLambda(MFunction<T, R> func) {
        // 直接调用writeReplace
        Method writeReplace = func.getClass().getDeclaredMethod("writeReplace");
        writeReplace.setAccessible(true);
        //反射调用
        Object sl = writeReplace.invoke(func);
        return (java.lang.invoke.SerializedLambda) sl;
    }

    /**
     * 获取到序列化SerializedLambda
     *
     * @param func 方法
     * @param <T>  泛型T
     * @return SerializedLambda
     */
    @SneakyThrows
    public static <T> SerializedLambda getSerializedLambda(MConsumer<T> func) {
        // 直接调用writeReplace
        Method writeReplace = func.getClass().getDeclaredMethod("writeReplace");
        writeReplace.setAccessible(true);
        //反射调用
        Object sl = writeReplace.invoke(func);
        return (java.lang.invoke.SerializedLambda) sl;
    }

    /**
     * 根据函数式接口获取字段名称
     *
     * @param func 函数式接口,例:User::getId()
     * @param <T>  泛型T
     * @param <R>  泛型R
     * @return 字段名
     */
    @SneakyThrows
    public static <T, R> String getColumn(MFunction<T, R> func) {
        return getColumn(getSerializedLambda(func));
    }

    /**
     * 根据Lambda表达式获取到执行的方法名称
     *
     * @param func 函数式接口
     * @param <T>  泛型T
     * @param <T>  泛型R
     * @return 方法名称
     */
    public static <T, R> String getMethodName(MFunction<T, R> func) {
        return getSerializedLambda(func).getImplMethodName();
    }

    /**
     * 根据Lambda表达式获取到执行的方法名称
     *
     * @param func 函数式接口
     * @param <T>  泛型T
     * @return 方法名称
     */
    public static <T> String getMethodName(MConsumer<T> func) {
        return getSerializedLambda(func).getImplMethodName();
    }

}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐