java通过lambda表达式获取字段名和方法名
1、两个序列化的函数式接口 MConsumer和MFunction。2、LambdaUtil获取字段名和方法名称的工具类。
·
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();
}
}
更多推荐
所有评论(0)