java 判断一个对象是否为空对象
大家好,又见面了,我是你们的朋友全栈君。
最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们一个一个判断特别麻烦,只能传个空对象过来,我第一个想法就是可以通过反射来判断对象是否为空。
第一版:
User.java
public class User {
private String username;
private Boolean active;
private Long id;
// 省略get和set方法
}
ReflectUtil.java
public class ReflectUtil {
public static boolean isObjectNull(Object obj){
if (obj != null) {
Class<?> objClass = obj.getClass();
Method[] declaredMethods = objClass.getDeclaredMethods();
if (declaredMethods.length > 0) {
int methodCount = 0; // get 方法数量
int nullValueCount = 0; // 结果为空
for (Method declaredMethod : declaredMethods) {
String name = declaredMethod.getName();
if (name.startsWith("get") || name.startsWith("is")){
methodCount += 1;
try {
Object invoke = declaredMethod.invoke(obj);
if (invoke == null) {
nullValueCount += 1;
}
} catch (IllegalAccessException | InvocationTargetException e){
e.printStackTrace();
}
}
}
return methodCount == nullValueCount;
}
}
return false;
}
}
TestReflect.java
public class TestReflect {
public static void main(String[] args) {
User user = new User();
System.out.println(ReflectUtil.isObjectNull(user));
}
}
结果:
true
第一版 获取一个类的声明的方法,判断方法如果以get或者is开头就是get方法,然后通过反射调用改方法获取结果,再判断结果是否为空,如果结果为null的话就把nullValueCount+1,最后返回结果为空的值的数量和get方法数量比较的结果,如果两者数量相同则说明该对象为空,反之不为空。 第一版也可以判断一个对象是否为空,但前提是对象必须使用包装类,没有默认值的就不行了,当然你也可以根据类型和返回值结果来判断对象是否为空,但是如果想忽略某个属性不做判断,改起来就有点麻烦了。 后来想知道spring 的BeanUtils 是怎么实现属性复制的就看了一下,发现了新的方法,于是就有了第二版。
第二版:
/** * 判断对象是否为空, * @param obj * @param ignoreProperties 忽略的属性 * @return 如果get 方法的数量等于 属性为空的数量 返回true,否则false */
public static boolean isNullObject(Object obj , String... ignoreProperties) throws IntrospectionException {
if (obj != null) {
Class<?> objClass = obj.getClass();
BeanInfo beanInfo = Introspector.getBeanInfo(objClass);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);
int count = 1; // 结果为空的属性数量 初始化为1 去除Object的getClass方法
int propertyCount = propertyDescriptors.length; // 属性数量
if (ignoreList != null){
propertyCount -= ignoreList.size();
}
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
Method readMethod = propertyDescriptor.getReadMethod();
String name = propertyDescriptor.getName();
if (readMethod != null && (ignoreList == null || !ignoreList.contains(name))) {
Class<?> returnType = readMethod.getReturnType();
String typeName = returnType.getSimpleName();
Object invoke = null;
try {
invoke = readMethod.invoke(obj);
if (invoke == null) {
count+=1;
}else {
switch (typeName) {
case "String":
if ("".equals(invoke.toString().trim())) {
count += 1;
}
break;
case "Integer":
if ((Integer) invoke <= 0) {
count += 1;
}
break;
case "int":
if ((int) invoke <= 0) {
count += 1;
}
break;
case "double":
if ((double) invoke <= 0.0d) {
count += 1;
}
break;
case "Double":
if ((Double) invoke <= 0.0D) {
count += 1;
}
break;
case "float":
if ((float) invoke <= 0.0f) {
count += 1;
}
break;
case "Float":
if ((Float) invoke <= 0.0F) {
count += 1;
}
break;
case "Long":
if ((Long) invoke <= 0L) {
count += 1;
}
break;
case "long":
if ((long) invoke <= 0L) {
count += 1;
}
break;
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
return propertyCount == count;
}
return true;
}
第一版和第二版思想基本都是一样的,都是通过读方法去判断返回值是否为空,只不过第二版在第一版上加强了可以忽略属性这个功能。 通过spring 的beanutils发现PropertyDescriptor这个类,从名字看来是个属性描述器,描述属性相关的东西,通过属性描述器可以获取bean的属性名称,读写方法,使用起来还挺方便。 通过Introspector内省类的静态方法getBeanInfo(Class<?> beanClass)获取BeanInfo,然后通过BeanInfo对象的getPropertyDescriptors()就可以返回属性描述器。 由于没有太多研究就不多介绍了。 如果你还有其他方法判断一个对象是否为空请留言,谢谢
能力有限,水平一般,如有错误,请多指出。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135219.html原文链接:https://javaforall.cn
相关文章
- java calendar计算时间差_Java Calendar 计算时间差
- 学java用什么编译器_学习Java用什么编译软件好
- java一个字符几个字节_Java 语言中一个字符占几个字节?
- Java基础入门笔记08——文件流,IO流,FileIputStream类,FileOutputStream类,缓冲流,转换流,标准输入输出流,打印流,数据流,对象流,随机存储流
- java数组转对象_java之数组和对象的互转「建议收藏」
- JAVA实验室设备管理系统代码_java做一个简单学生管理系统
- Java 9 - 17 特性解读:Java 10
- Java 对象序列化 NIO NIO2 深度解析详解编程语言
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)详解编程语言
- Java学习笔记之二java标识符命名规范详解编程语言
- Java Set.toArray()方法:用Set集合中的所有对象创建一个数组
- 服务器上的文件Java获取Linux服务器文件:简单又高效的操作方法(java获取linux)
- 时间Redis中设定Java对象有效期的技巧(redisjava过期)
- 机制Redis与Java实现的过期机制(redisjava过期)
- 让Java开发能力在Linux下得到更大发挥(java linux编程)
- Java工程师集MySQL技能于一身(java工程师mysql)
- 使用Java语言写Redis实现一个分布式缓存系统(用java写个redis)
- Oracle收购了Java一个伟大的转折点(java被oracle吗)
- Java 离开 Oracle,新的旅程即将开始(java没有Oracle)
- 数据库一步一步教你Java如何恢复Oracle数据库(java恢复oracle)
- 安装Oracle JDK 从Java进入下一个级别(oracle下载java)
- JAVA多态由浅及深介绍
- 深入Java对象的地址的使用分析
- 分享15款Java程序员必备的开发工具