日常开发中,总会遇到一些一下子摸不着头脑的需求,但是静下心来想想,方法总是有的,虽然最后可能会搞的面目全非。
需求一
给一些方法增加操作记录。so easy,增加操作记录有两种方式。
- 方式一比较高大上,AOP+注解,推荐环绕增强。
- 方式二就是写一个通用方法,在需要加记录的地方调一下就好了。虽然low,但是简单,容易控制。
要加的地方不多,先用第二种方式简单来搞一下,不然产品万一有后手就麻烦了。
需求二
果不其然,需求又来了。有几个方法是修改操作,产品想记录用户把 哪些值修改成了哪些值。
虽然有点绕,但是不慌。把修改之前的数据查出来,记录一下,然后和传的参数对比,就好了。
事实证明,想的还是太简单了。
- 简单一点的操作,
if-else
。使用if-else
判断哪些参数有值,哪些参数为null。 参数少还好,如果参数很多或者参数是个对象,对象里有十几个成员变量,一个个都用if-else
判断,最后真的是惨不忍睹。 刚好有一个方法是用@RequestBody
接收参数…
此时我灵机一动,怎么能忘了反射呢?
先看用法,判断一个对象里哪些变量非空
用一个简单的例子,假如有这样一个对象,假如它有很多成员变量,作为参数传进来,而现在我要用反射来判断它哪些变量非空。
@Data
public class User {
private String name;
private Integer age;
private String gender;
private String address;
}
@Test
public void testUser() throws Exception {
//获取class
Class<User> userClass = User.class;
//获取所有的成员变量
Field[] fields = userClass.getDeclaredFields();
//初始化一个对象
User user = new User();
//设置值
user.setName("test");
user.setAge(18);
for (Field field : fields) {
//设置权限
field.setAccessible(true);
//从对象中取该字段的值。可以理解为: field是一个瓶子,把对象装进去就能得到值
Object o = field.get(user);
if (o != null) {
//打印
System.out.println(field.getName() + " = " + o);
} else {
System.out.println(field.getName() + " is null");
}
}
}
执行结果
name = test
age = 18
gender is null
address is null
稍微改造一下,弄个工具类,写个静态方法,就可以随处调用了。