富贵不能淫;贫贱不能移;威武不能屈;此之谓大丈夫。——《孟子·滕文公下》

前两天看了点mybatis-plus源码,又看了点手工耿的视频,就有感而发,写下这个工具类

介绍:

平时我们返回给前端返回值就像这样

image-20201110213516991

我们每次都要写这个魔法值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;/**
* @ClassName: FunctionUtils
* @Date: 2020/11/9 0009 23:43
* @Description:
*/

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;

/**
* @ClassName: FunctionUtils
* @Description: 我还没有写描述
* @Date: 2020/11/9 0009 23:43
* *
* @author: <achao1441470436@gmail.com>
* @version: 1.0
* @since: JDK 1.8
*/
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());
}


}

之后我们就可以使用这种方式去获取属性名,再也不怕写错了

image-20201110214146632

怎么样,是不是很没用?!