富贵不能淫;贫贱不能移;威武不能屈;此之谓大丈夫。——《孟子·滕文公下》
前两天看了点mybatis-plus
源码,又看了点手工耿的视频,就有感而发,写下这个工具类
介绍:
平时我们返回给前端返回值就像这样
我们每次都要写这个魔法值key
这样一两个都还好,但久而久之可能会写错
如果我们如果遇到比较长的字段名,可能就要写很长很长,并且没有编译器的提示
所以我照着mybatis-plus
源码,顺便用了它一点方法,写了下面这个工具类
这个工具类里就一个方法和一个接口,以及一个测试的主函数,可以通过Lambda
表达式获取到它的属性名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| package com.ruben.utils;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; import com.ruben.pojo.User;
import java.io.*; import java.util.HashMap; import java.util.Map;
public class FunctionUtils {
@FunctionalInterface public interface IFunction<T, R> extends Serializable { R apply(T t); }
public static String getAttributeName(IFunction func) { if (!func.getClass().isSynthetic()) { throw ExceptionUtils.mpe("该方法仅能传入 lambda 表达式产生的合成类"); } SerializedLambda lambda; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(func); oos.flush(); ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())) { @Override protected Class<?> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException { Class<?> clazz = super.resolveClass(objectStreamClass); return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz; } }; lambda = (SerializedLambda) objIn.readObject(); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException("这不可能发生!", e); } String methodName = lambda.getImplMethodName(); return methodName.substring(3, 4).toLowerCase() + methodName.substring(4); }
public static void main(String[] args) { User user = new User(); Map<String, Object> map = new HashMap<>(1 << 4); IFunction<User, String> getUsername = User::getUsername; map.put(FunctionUtils.getAttributeName(getUsername), user.getUsername()); }
}
|
之后我们就可以使用这种方式去获取属性名,再也不怕写错了
怎么样,是不是很没用?!