摘要 调研java Class getDeclaredFields() 与getFields()的区别,设计请求参数为Javabean时,基于反射机制校验其中非空变量的公共方法。

java Class getDeclaredFields() 与getFields()的区别

概述:

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

(2)getFields 只返回公共字段,即由public修饰的字段。

测试之前,请定义一个代表员工的EmployeeDTO类,成员变量访问控制修饰符包括public等,当前,实际定义Javabean的时候,成员变量的控制修饰符是只可以为private的。

  1. public class EmployeeDTO {
  2. public Integer id;
  3. private String sex;
  4. private String name;
  5. protected String job; // 职位
  6. public Integer jobNumber;// 工号
  7. private float salary;
  8.  
  9. String phone;
  10. // 省略get、set方法
  11. }

测试用例,一个main函数:

  1. public class ValidationTest {
  2.  
  3. public static void main(String[] args) {
  4. // testGetDeclaredFields();
  5. // System.err.println(" ==================== ");
  6. // testGetFields();
  7. validateIsEmpty();
  8. }
  9.  
  10. public static void testGetDeclaredFields() {
  11. Field[] fields = EmployeeDTO.class.getDeclaredFields();
  12. for (int i = 0; i < fields.length; i++) {
  13. Field field = fields[i];
  14. System.out.println(field.getName());
  15. }
  16. }
  17.  
  18. public static void testGetFields() {
  19. Field[] fields = EmployeeDTO.class.getFields();
  20. for (int i = 0; i < fields.length; i++) {
  21. Field field = fields[i];
  22. System.out.println(field.getName());
  23. }
  24. }
  25.  
  26. }

testGetFields ()打印结果:

  1. id
  2. jobNumber

testGetDeclaredFields ()打印结果:

  1. id
  2. sex
  3. name
  4. job
  5. jobNumber
  6. salary
  7. phone

由测试结果可见,上述概述成立。

校验Java bean中非空字段

在ValidationTest中新增如下函数:

  1. public static void validateIsEmpty() {
  2. EmployeeDTO emp = new EmployeeDTO();
  3. emp.setId(100);
  4. emp.setJob(null);
  5. emp.setJobNumber(100001);
  6. List<String> checkedFieldNames = new ArrayList<>();
  7. checkedFieldNames.add("id");
  8. checkedFieldNames.add("job");
  9. checkedFieldNames.add("jobNumber");
  10. try {
  11. ValidationUtils.checkNotEmpty(emp, checkedFieldNames);
  12. } catch (Exception e) {
  13. System.out.println("-----------");
  14. System.out.println(e.getMessage());
  15. }
  16. }

其中,本章节的主角ValidationUtils源码如下:

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.util.List;
  4.  
  5. /**
  6. * @Description 校验工具类
  7. */
  8. public class ValidationUtils {
  9.  
  10. private final static String PIX_GET = "get";
  11.  
  12. /**
  13. * @Description 只校验列表中传入的字段,断言对象中的字段值非空
  14. *
  15. * @param object 待检测对象
  16. * @param checkedFieldNames 被检查变量
  17. * @throws Exception 如果被校验字段的值为空,抛出此异常
  18. */
  19. public static void checkNotEmpty(Object object, List<String> checkedFieldNames) throws Exception {
  20. if (null == object) {
  21. throw new Exception("Param is NULL");
  22. }
  23. Class<?> clazz = object.getClass();
  24. Field[] fields = clazz.getDeclaredFields();
  25. String fieldName = "";
  26. StringBuilder methodName = null;
  27. Method method = null;
  28. for (Field field : fields) {
  29. fieldName = field.getName();
  30. if (!hasElement(fieldName, checkedFieldNames)) {
  31. continue;
  32. }
  33. methodName = new StringBuilder(PIX_GET);
  34. methodName = methodName.append(fieldName.substring(0, 1).toUpperCase())
  35. .append(fieldName.substring(1));
  36. method = clazz.getDeclaredMethod(methodName.toString());
  37. Object result = method.invoke(object);
  38. if (null == result || "".equals(result)) {
  39. throw new Exception("Non-empty field 【".concat(fieldName).concat("】 is empty"));
  40. }
  41. }
  42. }
  43.  
  44. /**
  45. * 检测container数组是否包含element元素
  46. *
  47. * @return boolean,true 包含
  48. */
  49. private static boolean hasElement(String element, List<String> containers) {
  50. if (containers.contains(element)) {
  51. return true;
  52. }
  53. return false;
  54. }
  55. }

在main函数中调用后,控制台打印如下信息:

Non-empty field 【job】 is empty

表明校验成功,如果为job赋值为非空,则不再提示此信息。至于其它成员变量,同理可以测试。

所以,在校验实际业务场景中的JavaBean的时候,就无需每次手动校验了。丢给ValidationUtils即可,是不是很方便?

Javabean非空变量校验工具的更多相关文章

  1. 使用AOP和Validator技术对项目接口中的参数进行非空等校验

    javax.validation.Validator基础知识补充: validator用来校验注解的生效,如: @NotBlank(message = "地址名不能为空") pri ...

  2. js的非空校验

    利用TagName获取元素名称,进行批量非空校验 var input = document.getElementsByTagName("input"); for (var i=0; ...

  3. kotlin之变量的可空与非空

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/218 kotlin之变量的可空与非空 上面一篇文章,介绍了 ...

  4. JavaScript 数据值校验工具类

    /** * 数据值校验工具类 */ var checkService = { // 不校验 none: function () { return true; }, //非空校验 isEmpty: fu ...

  5. java基础之----非空判断

    大家好,第一次写博客,一直想写博客,用于自我总结,也用于帮助新同学成长. 平常我们开发的时候,用到很多非空判断,但是很多同学用到的地方不是很准确,这里,我把自己平时遇到的坑跟大家说说.我废话不多,只想 ...

  6. unity, 非public变量需要加[SerializeField]才能序列化

    非public变量需要加[SerializeField]才能序列化 例如: MonoBehaviour中: [SerializeField] private float m_xxx; 在相应的Cust ...

  7. 非空验证(源代码Java版)

    import java.util.Map; /** * 非空验证工具类 */ public class UntilEmpty { /** * @see: 验证string类型的是否为空 */ publ ...

  8. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  9. JS中if判断 非空即为真 非0即为真

    1.字符串参与判断时:非空即为真判断字符串为空的方法if(str!=null && str!=undefined && str !='')可简写为if(!str){   ...

随机推荐

  1. mysql批量进行optimize table操作

    数据库运行一段时间后,有可能会有磁盘磁片产生,此时我们需要进行optimize table操作 # 获取需要optimize的表:如下为获取总大小小于80G的表进行操作:mysql -utroot - ...

  2. MYSQL + MHA +keepalive + VIP安装配置(二)--MHA的配置

    一.总概 1.MHA介绍 MHA(Master High Availability)是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).      MH ...

  3. Solr学习笔记——导入JSON数据

    1.导入JSON数据的方式有两种,一种是在web管理界面中导入,另一种是使用curl命令来导入 curl http://localhost:8983/solr/baikeperson/update/j ...

  4. Oracle 11g:bin目录下3个特效权限的文件:root用户所有者 + s权限

  5. 微信小程序中使用Async-await方法异步请求变为同步请求

    微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...

  6. [Bayes] openBUGS: this is not the annoying bugs in programming

    Bayesian inference Using Gibbs Sampling 允许用户指定复杂的多层模型,并可使用MCMC算法来估计模型中的未知参数. We use DAGs to specify ...

  7. [IR] Huffman Coding

    为了保证:Block中,所有的叶子在所有的中间结点的前面.Static: Huffman coding Dynamic: Adaptive Huffman 一些概念 压缩指标 • Compress a ...

  8. [JS] Topic - this is ”closure“

    Ref: 为什么要用闭包? 背景 闭包是自带运行环境的函数 发哥是自带背景音乐的男人~ 就是有权访问另一个函数作用域的变量的函数. 函数式编程的闭包,就是函数的调味包.方便用户调用函数.不必为了维护繁 ...

  9. 《objective-c基础教程》学习笔记(三)—— 从结构体到面向对象

    一听标题,感觉十分的抽象.面向对象就是(Object-Oriented Programming)的首字母缩写:OOP,是当今最主流的编程方法. 那么,面向对象编程具体有什么好处呢.是如何来实现呢?通过 ...

  10. linux下mysql 文件导入导出

    最近在做mysql的数据导入导出得到的一些经验,记录下. 1.首先要开通导入导出的功能,需要设置一个mysql的配置 可以在 my.conf 文件的最后增加配置项 secure-file-priv=' ...