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