java函数式接口-非空字段校验

更新时间:2023-05-31 08:48:27 阅读: 评论:0

java函数式接⼝-⾮空字段校验
⼀、概述
做⼀个,可以传⼊对象,⽅法声明的形式校验参数⾮空,想要实现的效果如下
//ur类:Long id,String name;
Ur ur =new Ur(1L,"");
JsonUtils.validEmpty(ur,Ur::getId,Ur::getName);
说⼀下思路
传⼊对象,⽅法声明(即对象⽅法),可以⽤到有来有回的函数接⼝ R apply(T t)。
函数接⼝可以获取的信息有:
1. 传⼊的类型
2. 传⼊的调⽤⽅法
遇仙寺
3. 对象对应⽅法的返回值
4. 对象对应⽅法返回值类型
校验到⾮空字段后,需要知道这个字段代表什么意思,这⾥使⽤⼀个⾃定义注解,将此注解到对应字段上,⾥⾯的value就是字段含义逻辑:
1. 根据传⼊的对象ur,获取到对象对应⽅法的值(apply函数接⼝特性)
2. 根据获取的值做⾮空校验,获取到为空的字段
3. 获取字段Field类信息(知道 Class对象,调⽤⽅法)
4. 获取字段的注解value
5. 返回为空的字段信息。
⼆、⾃定义函数接⼝
import CommentTarget;
import StringUtils;
北京冬import Serializable;
import SerializedLambda;
import Field;
import Method;
import Optional;
//函数式接⼝注解
@FunctionalInterface
public interface SFunction<T,R>extends Serializable {
/**
* 函数接⼝⽅法,如Ur对象,利⽤ur获取到其 id,name
* 此种⽅法可以使⽤ Ur::getId
* 其余需要传⼊ ur::getId
* @param t
* @return
*/
R apply(T t);
/**
* 获取SerializedLambda,如果传⼊Ur::getId 含有内容
* implClass:接⼝实现类型 Ur
* implMethodName:调⽤⽅法 getId
*  implMethodSignature:⽅法属性返回值类型
* @return SerializedLambda
* @return SerializedLambda
* @throws Exception
*/
default SerializedLambda getSerializedLambda()throws Exception { //writeReplace改了好像会报异常
Method write =Class().getDeclaredMethod("writeReplace");      write.tAccessible(true);
return(SerializedLambda) write.invoke(this);
}
/**
* 获取接⼝实现类
* @return stdemo.pojo.Ur
*/
default String getImplClass(){
try{
//这⾥拿到的数据是com/cuihq/。。。
//需要将 /转换成. 利⽤Class.forName才会⽣效
String implClass =getSerializedLambda().getImplClass();
String result = place("/",".");
return result;
}catch(Exception e){
return null;
}
}
/
**乐观的网名
* 获取调⽤⽅法
* Ur::getName -> getName();
* @return 调⽤⽅法名称
*/
default String getImplMethodName(){
try{
return getSerializedLambda().getImplMethodName();
}catch(Exception e){
return null;
生态英语}
}
/**
* 获取bean属性,getName->name
* 只针对get⽅法使⽤
* @return bean属性
*/
default String getFieldName(){
String methodName =ImplMethodName();
String valueTmp = StringUtils
.removeStartIgnoreCa(methodName,"get");
String valuePre = valueTmp.substring(0,1);
String valueSux = valueTmp.substring(1);
LowerCa()+ valueSux;
}
/**
* 获取CommentTarget注解的value(字段中⽂含义);
* 思路:SFunction函数中可以获取
*      传⼊类的类型,调⽤的⽅法,即可获取到对应的字段属性
* @return CommentTarget注解的value;
*/
default  String getCommentValue(){
String fieldName =FieldName();
String implClass =ImplClass();
Field f =null;
try{
f =getField(Class.forName(implClass), fieldName);
}catch(ClassNotFoundException e){
多管闲事的歇后语e.printStackTrace();
}
CommentTarget commentTarget =null;
if(f!=null){
commentTarget = f.getAnnotation(CommentTarget.class);
}
return commentTarget==null?"": commentTarget.value(); }海鲜蘑菇汤
/**
* 获取Class类的字段属性Field
养生甜品* @param c class类型
* @param FieldName 属性名称
* @return Field类
*/
default Field getField( Class<?> c, String FieldName){
try{
Field f = c.getDeclaredField(FieldName);
return f;
}catch(NoSuchFieldException e){
Superclass()==null){
return null;
}
el{
return getField( c.getSuperclass(), FieldName);
}
}catch(Exception ex){
return null;
}
}
}
⼆、⾃定义注解
package;
import Retention;
import RetentionPolicy;
/**
* @author cuihq
* ⽤于解释字段含义
*/
@Retention(RetentionPolicy.RUNTIME)
public@interface CommentTarget {
/
**
* 字段值(驼峰命名⽅式,该值可⽆)
*/
String value()default"";
}
三、⼯具类⽅法
/**
* 不需要继承接⼝的⾮空校验
* @param obj 需要被校验的对象
抓山鸡
* @param functions 对象需要被校验的⽅法
* @param <T> 校验对应的泛型
* @throws Exception
*/
static<T>void validEmpty(Object obj, SFunction<T,?>... functions){
String msg = Stream.of(functions)
.filter(x ->isAnyoneEmpty(x.apply((T) obj)))
.map(fun -> String.format("【%s】不能为空", CommentValue())) .collect(Collectors.joining(","));
System.out.println(msg);
}
private static boolean isAnyoneEmpty(Object obj){
if(obj ==null){
return obj ==null;
}el if(obj instanceof Collection<?>){
return((Collection<?>) obj).isEmpty();
}el if(obj instanceof String){
String().length()==0;
}el Class().isArray()){
return((Object[]) obj).length ==0;
}el if(obj instanceof Map){
return((Map<?,?>) obj).isEmpty();
}el if(obj instanceof StringBuffer){
return((StringBuffer) obj).length()==0;
}el if(obj instanceof StringBuilder){
return((StringBuilder) obj).length()==0;
}
return fal;
}
四、单元测试
/**
* 测试⾮空校验⽅法
*/
@Test
public void validEmptyTest(){
Ur ur =new Ur(1L,"");
JsonUtils.validEmpty(ur,Ur::getId,Ur::getName);
}
输出结果
【⾃定义name】不能为空

本文发布于:2023-05-31 08:48:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/819205.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:获取   字段   校验   对象   对应   注解
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图