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

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

概述:

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

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

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

public class EmployeeDTO {
public Integer id;
private String sex;
private String name;
protected String job; // 职位
public Integer jobNumber;// 工号
private float salary; String phone;
// 省略get、set方法
}

测试用例,一个main函数:

public class ValidationTest {

    public static void main(String[] args) {
// testGetDeclaredFields();
// System.err.println(" ==================== ");
// testGetFields();
validateIsEmpty();
} public static void testGetDeclaredFields() {
Field[] fields = EmployeeDTO.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
} public static void testGetFields() {
Field[] fields = EmployeeDTO.class.getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
} }

testGetFields ()打印结果:

id
jobNumber

testGetDeclaredFields ()打印结果:

id
sex
name
job
jobNumber
salary
phone

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

校验Java bean中非空字段

在ValidationTest中新增如下函数:

public static void validateIsEmpty() {
EmployeeDTO emp = new EmployeeDTO();
emp.setId(100);
emp.setJob(null);
emp.setJobNumber(100001);
List<String> checkedFieldNames = new ArrayList<>();
checkedFieldNames.add("id");
checkedFieldNames.add("job");
checkedFieldNames.add("jobNumber");
try {
ValidationUtils.checkNotEmpty(emp, checkedFieldNames);
} catch (Exception e) {
System.out.println("-----------");
System.out.println(e.getMessage());
}
}

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

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List; /**
* @Description 校验工具类
*/
public class ValidationUtils { private final static String PIX_GET = "get"; /**
* @Description 只校验列表中传入的字段,断言对象中的字段值非空
*
* @param object 待检测对象
* @param checkedFieldNames 被检查变量
* @throws Exception 如果被校验字段的值为空,抛出此异常
*/
public static void checkNotEmpty(Object object, List<String> checkedFieldNames) throws Exception {
if (null == object) {
throw new Exception("Param is NULL");
}
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
String fieldName = "";
StringBuilder methodName = null;
Method method = null;
for (Field field : fields) {
fieldName = field.getName();
if (!hasElement(fieldName, checkedFieldNames)) {
continue;
}
methodName = new StringBuilder(PIX_GET);
methodName = methodName.append(fieldName.substring(0, 1).toUpperCase())
.append(fieldName.substring(1));
method = clazz.getDeclaredMethod(methodName.toString());
Object result = method.invoke(object);
if (null == result || "".equals(result)) {
throw new Exception("Non-empty field 【".concat(fieldName).concat("】 is empty"));
}
}
} /**
* 检测container数组是否包含element元素
*
* @return boolean,true 包含
*/
private static boolean hasElement(String element, List<String> containers) {
if (containers.contains(element)) {
return true;
}
return false;
}
}

在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. html页面工具-htmlUnit

    HtmlUnit测试工具的推出,创意非常好.是一款给java开发用的browser.说它是browser,其实它是对html建模并且提供API来访问页面,点击链接等等的java类库.     这样的测 ...

  2. linux 网络配置 (配置/etc/sysconfig/network-scripts/ifcfg-ethx)

    背景 需要往服务器上安装软件:并且像maven代理的话必须连接公网.首先配置了网关,发现可以通过ip访问公网了,在配置了DNS可以通过域名访问公网了 实例 配置linux 可以上网的操作 vi /et ...

  3. 上网爱快?EasyRadius FOR 爱快V2接口测试版正式推出,欢迎广大爱迷们测试噢

    …… …… 有些人问:为什么上面要打省略号?那些因为此处省略无数字,但是我还是要和大伙们谈谈EasyRadius支持爱快的故事 早在2013年的时候,我们内部就有发布爱快接口,但是由于当时V1的爱快, ...

  4. JdbcTemplate in()传参

    1. 实体类 import java.util.List; public class Param { private List<String> names; private List< ...

  5. API(二)之Requests and Responses

    这一部分可以让返回的api信息以两种格式呈现:.json和.api REST框架的核心部分.我们来介绍几个基本的组成部分. Request objects REST框架引入了Request对象来扩展常 ...

  6. AIX文件系统和存储部署(转)

    文件系统和存储部署 文件系统的管理是AIX存储结构中的最后一环.定义完lv后,可采用如下两种方式使用lv: a.作为裸设备(raw)使用,一般是数据库型的应用 b.在lv上定义文件系统,并提供文件和数 ...

  7. robot framework ——关键字run keyword if 如何在一个条件下接多个执行语句,以及如何写复杂条件句

    曾一度疯狂搜索run keyword if 的用法,帖子是挺多的,可惜,没有一个我想要的.现在我终于把我想要的用法,收集好了,在此总结下. 1.曾经天真的以为  run keyword if +条件 ...

  8. centos 安装教程 服务器配置教程 服务器中安装python 服务器中安装Django 安装MySQL 配置MySQL

    一 .解决python编译安装所需的软件依赖 yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel opens ...

  9. ubuntu下pig报错ERROR 2999: Unexpected internal error. Failed to create DataStorage的解决

    2019-03-04 00:10:03,998 [main] ERROR org.apache.pig.Main - ERROR 2999: Unexpected internal error. Fa ...

  10. 若父设置了overflow: hidden;子如何不受影响

    若父设置了overflow: hidden;子如何不受影响 1.如图: 2.只需要给一个position: absolute;定位 3.相当于重新给页面进行定位,右侧便会有滚动条出现. 4.overf ...