一、概述
做一个,可以传入对象,方法声明的形式校验参数非空,想要实现的效果如下
//user类:Long id,String name;
User user = new User(1L,"");
JsonUtils.validEmpty(user,User::getId,User::getName);
说一下思路
-
传入对象,方法声明(即对象方法),可以用到有来有回的函数接口 R apply(T t)。
-
函数接口可以获取的信息有:
- 传入的类型
- 传入的调用方法
- 对象对应方法的返回值
- 对象对应方法返回值类型
-
校验到非空字段后,需要知道这个字段代表什么意思,这里使用一个自定义注解,将此注解到对应字段上,里面的value就是字段含义
-
逻辑:
- 根据传入的对象user,获取到对象对应方法的值(apply函数接口特性)
- 根据获取的值做非空校验,获取到为空的字段
- 获取字段Field类信息(知道 Class对象,调用方法)
- 获取字段的注解value
- 返回为空的字段信息。
二、自定义函数接口
import com.cuihq.testdemo.annotation.CommentTarget;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Optional;
//函数式接口注解
@FunctionalInterface
public interface SFunction<T,R> extends Serializable {
/**
* 函数接口方法,如User对象,利用user获取到其 id,name
* 此种方法可以使用 User::getId
* 其余需要传入 user::getId
* @param t
* @return
*/
R apply(T t);
/**
* 获取SerializedLambda,如果传入User::getId 含有内容
* implClass:接口实现类型 User
* implMethodName:调用方法 getId
* implMethodSignature:方法属性返回值类型
* @return SerializedLambda
* @throws Exception
*/
default SerializedLambda getSerializedLambda() throws Exception {
//writeReplace改了好像会报异常
Method write = this.getClass().getDeclaredMethod("writeReplace");
write.setAccessible(true);
return (SerializedLambda) write.