java Function获取实体类字段名称

      在使用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));
    }


版权声明:本文为weixin_44912855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。