我们在写项目的时候,如何类比较少。判别指定对象的属性值是否为空,那确实可以,但是随着类的增多,判别对象的属性是否为空就非常的繁琐,所以可以使用自定义注解和反射来判定指定的字段是否为空。

第一步:创建一个自定义注解

package com.zczy.test.annoation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ParamsCheck {

/**

* 此注解就是过滤不需要的字段,来判断需要的字段是否为空

*/

String attributeName();

}

第二步:创建一个类,并在类的属性上加上自定义注解的标识,就是为了判断这些字段是否为空

package com.zczy.test.bean;

import com.zczy.test.annoation.ParamsCheck;

import lombok.Data;

@Data

public class Person {

@ParamsCheck(attributeName = "userName")

private String userName;

@ParamsCheck(attributeName = "id")

private String id;

private String sex;

public Person(String userName,String id,String sex){

this.userName = userName;

this.id = id;

this.sex = sex;

}

}

第三部:自定义一个返回类型的类

package com.zczy.test.utils;

import lombok.Data;

@Data

public class ValidResult {

private String msg;

private String code;

public ValidResult(){

}

public ValidResult(String msg,String code){

this.msg = msg;

this.code = code;

}

}

第四步:编写反射的代码

package com.zczy.test.utils;

import com.zczy.test.annoation.ParamsCheck;

import java.lang.annotation.Annotation;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

public class CheckPointParamsHandlar {

public Class clazz;

private Field[] fields;

private T t;

public CheckPointParamsHandlar(T t){

this.t = t;

this.clazz = t.getClass();

//getDeclaredFields()返回Class中所有的字段,包括私有字段;

//getFields 只返回公共字段,即有public修饰的字段

this.fields = t.getClass().getDeclaredFields();

}

//判断已经注解的字段是否为空

public ValidResult getParamChecksResults(){

List list = new ArrayList<>();

ValidResult res = new ValidResult();

Boolean flag = true;

StringBuffer sb = new StringBuffer();

for(Field field : fields ){

//System.out.println(field);

//private java.lang.String com.zczy.test.bean.Person.userName

//private java.lang.String com.zczy.test.bean.Person.id

//private java.lang.String com.zczy.test.bean.Person.sex

//查看注解的必要字段不能为空--如果没有注解直接跳过

Annotation annotation=null;

annotation = field.getAnnotation(ParamsCheck.class);

if(annotation == null){

continue;

}

//判断注解过的字段是否为空

// System.out.println("annotation>>>>>"+annotation);

//annotation>>>>>@com.zczy.test.annoation.ParamsCheck(attributeName=userName)

//annotation>>>>>@com.zczy.test.annoation.ParamsCheck(attributeName=id)

String name = field.getName();

// System.out.println(name);

// userName

// id

// sex

char[] tempChar = name.toCharArray();

tempChar[0] -= 32;

String tempStr ="get"+ String.valueOf(tempChar);

list.add(tempStr);

//System.out.println("list>>>>>"+list);

// list>>>>>[getUserName, getId]

}

for(String str : list){

try {

Method method = clazz.getMethod(str);

//System.out.println("method>>>"+method);

// method>>>public java.lang.String com.zczy.test.bean.Person.getUserName()

//method>>>public java.lang.String com.zczy.test.bean.Person.getId()

Object invoke = method.invoke(t);

// System.out.println(invoke);

if(null == invoke || "".equals(invoke)){

flag = false;

sb.append(str.toLowerCase()+"不能为空").append(",");

}

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

if(flag == false){

res = new ValidResult(sb.toString(),"1");

}else{

res = new ValidResult("校验成功!","0");

}

return res;

}

}

测试类:

package com.zczy.test.Test;

import com.zczy.test.bean.Person;

import com.zczy.test.utils.CheckPointParamsHandlar;

import com.zczy.test.utils.ValidResult;

public class ParamsCheckTest {

public static void main(String[] args) {

Person person = new Person("1111","22","111");

ValidResult paramChecksResults = new CheckPointParamsHandlar<>(person).getParamChecksResults();

System.out.println(paramChecksResults.toString());

}

}

结果:

测试1:

测试2:

测试3:

测试4:

本文地址:https://blog.csdn.net/trainhui/article/details/107336671

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java注解判断字段是否存在_使用注解和反射判断指定的字段不能为空相关推荐

  1. java判断是否完数_输入一个数,判断是否为完数

    import java.util.Scanner;//导入工具包 public class Exercise { public static void main(String[] args) { Sc ...

  2. java ajax无权限跳转_如何在ajax权限判断后跳转?

    经常会遇到一种场景,直接访问某些权限被拒绝后跳转登陆页面,然而ajax不会跳转 这个时候使用全局的: $(function(){ //全局的ajax访问,处理ajax清求时sesion超时 $.aja ...

  3. datatables 一列显示两个字段的数据_【tableau入门教程16】计算字段

    有时数据表中的原始维度和度量并不满足我们的需求,因此可通过计算字段功能,利用各种函数新建字段. 创建字段步骤 1.在侧栏 创建计算字段 2.拖曳字段到输入框或是输入部分字段名称选择字段,当输入框下面显 ...

  4. linux判断是否能上网_母亲提醒女儿:判断一个男人是否值得嫁,从这两点就能轻易看出...

    没有哪个母亲不希望自己的女儿能够在长大之后嫁给一个出色的男人. 当然,这样的男人不需要有太多的钱或者出色的外貌,但必须得具备一定的人品. 我的一个朋友今年26岁,已经到了适婚年龄的她渴望着嫁给一个好男 ...

  5. python判断密码是否正确_第一个python程序-判断登陆用户名和密码是否正确

    #setencoding=utf-8#用户名和密码输入正确,则登陆成功 #用户名正确密码错误,只再输入密码,有3次机会 #错误3次,则把用户名放入lock中 import os,sys #存放用户名和 ...

  6. jqgrid 判断是否最后一行_连续数据的条件判断

    前几天有学员问了一个问题,如果他的单元格中包含某些字符,那么在最后一列中就显示有用,否则显示不可用.如下: 当含有carpet时,最后一列中显示有用. 其实,这个函数非常简单,既然是查找某个字符,直接 ...

  7. js if判断多个条件_五、if 条件判断

    if 条件判断 1.开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样? 判断的定义 ·如果条件满足,才能做某件事情, ·如果条件不满足,就做另外一件事情 ...

  8. Java查询对象中匹配元素_用LinkedList如何实现搜索指定对象的元素

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import static java.lang.System.out; import java.util.*; public class TestLink ...

  9. python判断题题库_《Python程序设计》判断题1-240题

    1.Python是一种跨平台.开源.免费的高级动态编程语言.(对) 2.Python 3.x完全兼容Python 2.x.(错) 3.Python 3.x和Python 2.x唯一的区别就是:prin ...

最新文章

  1. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题
  2. 【客户下单】后台提供webservice服务接收数据
  3. MAC OS Sierra 10.12.6 下对固态硬盘SSD 开启TRIM功能
  4. shell学习笔记二
  5. nativefier - 把网页生成桌面应用程序
  6. zabbix监控第一台服务器(10)
  7. 《SPSS统计分析与行业应用实战》之P2P行业中的应用
  8. 职称计算机考试题库word2003,全国职称计算机考试题库(Word2003模块)
  9. Blender 快捷键笔记
  10. ros_arduino_bridge功能包集的使用
  11. 精彩泄漏截图 2006最值得期待的游戏
  12. 操作系统基础:内存管理逻辑思维导图,简单看懂内存管理的逻辑
  13. Web前端--HTML+CSS+JavaScript响应式网络科技网页设计
  14. 科研——多问、多交流
  15. linux结束驱动程序,在linux上安装FTDI设备驱动程序[关闭]
  16. python和易语言哪个好学_易语言好用还是python语言好用?
  17. 单片机实现PT2262解码原理
  18. 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解
  19. NUMECA/FineTurbo计算中自动调用CFview实时数据处理
  20. 通达信板块监控指标_通达信辅助判断指标公式行业板块看盘幅图

热门文章

  1. 二分类吸引子和鞍点的准确率的表达式ca
  2. 用反向传导做分子模拟:苯胺(C6H5NH2)和硝基苯(C6H5NO2)
  3. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第2章-一类多智能体系统的领导-跟随一致性
  4. LTE轻松进阶之帧结构
  5. 【PC工具】更新常用USB转串口芯片MAC驱动,CH340G驱动安装有可能遇到的问题及解决办法...
  6. PIC单片机 电容式触摸检测
  7. 6.MATLAB变量——矩阵操作一
  8. 查询进程并杀死该进程
  9. C#windows服务开发
  10. iphone11系统输入框的光标位置不正常