java objectUtils 使用可能会出现的问题


Posted in Java/Android onFebruary 28, 2022

objectUtils使用可能会出现的问题

当一个类没有实现toString方法的时候,objectUtils会通过调用object的toString方法对对象实例化,所以objectUtils.isEmpty可能会对为空的对象返回false

例如

String s1 = ObjectUtils.identityToString(null);
String s2 = ObjectUtils.identityToString("");
String s3 = ObjectUtils.identityToString(Boolean.TRUE);
System.out.println(s1); // null
System.out.println(s2); //java.lang.String@73a80183
System.out.println(s3); //java.lang.Boolean@1afb7ac7

推荐使用

判断对象为空直接使用null ,判断字符就用string

public static boolean isNullOrEmpty(Object obj){undefined
return obj ==null || “”.equals(obj.toString())
}
public static boolean isEmpty(String str ) {return str==null || str.length() ==0;}

判断对象内容是否为空ObjectUtils工具类

public class ObjectUtils {
    /**
     * 判断对象是否为空(根据一般常用类型区分)
     * @param object
     * @return: boolean
     */
    public static boolean isEmpty(Object object){
        //判断对象是否为null
        if (null == object){
            return true;
        }
        //判断对象是否为String类型
        if (object instanceof String){
            if (object.toString().length() == 0){
                return true;
            }
        }
        //判断对象是否为Map
        if (object instanceof Map){
            Map map = (Map)object;
            if (map.size() == 0){
                return true;
            }
        }
        //判断对象是否为List
        if (object instanceof List){
            List list = (List)object;
            if (list.size() == 0){
                return true;
            }
        }
        //普通的类对象
        Field[] fields = object.getClass().getDeclaredFields();
        //先假设全部属性都是空的,所以只要出现一个属性不为空的就不需要在循环判断
        boolean flag = true;
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                if (!ObjectUtils.isEmpty(field.get(object))) {
                    flag = false;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 判断obejct对象中除了names里面的字段,其他字段都为null(已知对象类型)
     * @param object
     * @param names
     * @return
     */
    public static boolean isEmpty(Object object,String... names){
        Field[] fields = object.getClass().getDeclaredFields();
        //用于判断所有属性是否为空,如果参数为空则不查询
        boolean flag = true;
        for (Field field : fields) {
            //不检查 直接取值
            field.setAccessible(true);
            try {
                String fieldName = field.getName();
                List<String> nameList = new ArrayList<>();
                if (null != names && names.length != 0){
                    nameList = Arrays.asList(names);
                }
                if (!nameList.contains(fieldName) && !Objects.isNull(field.get(object))) {
                    //不为空
                    flag = false;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    /**
     * 判断object对象中除了names里面的字段,其他字段都为null或者是""(已知对象类型)
     * @param object
     * @param names
     * @return
     */
    public static boolean isBlank(Object object,String... names){
        Field[] fields = object.getClass().getDeclaredFields();
        //用于判断所有属性是否为空,如果参数为空则不查询
        boolean flag = true;
        for (Field field : fields) {
            //不检查 直接取值
            field.setAccessible(true);
            try {
                String fieldName = field.getName();
                List<String> nameList = new ArrayList<>();
                if (null != names && names.length != 0){
                    nameList = Arrays.asList(names);
                }
                Object value = field.get(object);
                if (!nameList.contains(fieldName) && !isEmpty(value)) {
                    //不为空
                    flag = false;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
Java 语言中Object 类和System 类详解
Jul 07 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 Java/Android
app场景下uniapp的扫码记录
Jul 23 Java/Android
OpenFeign实现远程调用
Aug 14 Java/Android
JVM之方法返回地址详解
Feb 28 #Java/Android
解决persistence.xml配置文件修改存放路径的问题
Feb 24 #Java/Android
Java实现学生管理系统(IO版)
alibaba seata服务端具体实现
Feb 24 #Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 #Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 #Java/Android
正则表达式拆分url实例代码
Feb 24 #Java/Android
You might like
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
将OICQ数据转成MYSQL数据
2006/10/09 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP.vs.JAVA
2016/04/29 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
理解Python垃圾回收机制
2016/02/12 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python 如何调用 dubbo 接口
2020/09/24 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
.NET概念性的面试题
2012/02/29 面试题
linux面试题参考答案(8)
2016/04/19 面试题
学习“七一”讲话精神体会
2014/07/08 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
大学生军训感言
2015/08/01 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers