在使用LambdaQueryWrapper的时候, 使用Function的形式传递参数比较好用优雅而且不会写错, .eq(User::getAge), 正在又碰上自己要写个工具类, 也要根据传进来的实体类字段名进行处理, 就想到了也用这种形式传递参数
首先看一下mybatis-plus是如何实现的, 具体参考mybatis-plus 的lambdaQueryWrapper的参数是如何利用lambda形式获取的
大体就是利用反射结合SerializedLambda进行获取, 尝试自己写一下
首先要定一个序列化的Function
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}
直接赋代码吧
private static <T> String fnToFieldName(SFunction<T, ?> fn) {
try {
Method method = fn.getClass().getDeclaredMethod("writeReplace");
method.setAccessible(true);
SerializedLambda serializedLambda = (SerializedLambda) method.invoke(fn);
String fieldWithGet = serializedLambda.getImplMethodName();
// 转小驼峰
char[] chars = fieldWithGet.substring(3).toCharArray();
chars[0] = Character.toLowerCase(chars[0]);
return new String(chars);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
测试
public static void main(String[] args) {
System.out.println(fnToFieldName(TSocUser::getEmail));
}