天天看點

java Function擷取實體類字段名稱

      在使用LambdaQueryWrapper的時候, 使用Function的形式傳遞參數比較好用優雅而且不會寫錯, .eq(User::getAge), 正在又碰上自己要寫個工具類, 也要根據傳進來的實體類字段名進行處理, 就想到了也用這種形式傳遞參數

 首先看一下mybatis-plus是如何實作的, 具體參考mybatis-plus 的lambdaQueryWrapper的參數是如何利用lambda形式擷取的

java Function擷取實體類字段名稱
java Function擷取實體類字段名稱

大體就是利用反射結合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));
    }
           
java Function擷取實體類字段名稱

繼續閱讀