java 判断一个对象是否为空对象

2023-11-15

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为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()就可以返回属性描述器。
由于没有太多研究就不多介绍了。
如果你还有其他方法判断一个对象是否为空请留言,谢谢

能力有限,水平一般,如有错误,请多指出。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 判断一个对象是否为空对象 的相关文章

  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A

随机推荐

  • 华为方舟编译器开源项目编译第四弹——自带Java测试用例的编译

    在编译Java测试用例时的错误提示信息 javac option bootclasspath not allowed with target 1 9 Usage javac
  • 计算机硬件基础——第五章:指令系统(二)

    文章目录 指令 要求计算机执行特定操作的命令 是程序员智慧计算机工作的最小单位 指令系统 一台计算机全部指令的集合 也称为计算机指令集 80X86 CPU的常用指令 逻辑运算指令 用来对字或字节按位进行逻辑运算 逻辑与AND 指令 逻辑或O
  • 计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

    目录 一 计算机网络的概念 二 计算机网络的功能 三 计算机网络的组成 1 组成部分 2 工作方式 3 功能组成 四 计算机网络的分类 1 按分布范围分 2 按使用者分 3 按交换技术分 4 按拓扑结构分 5 按传输技术分 五 标准化工作
  • WAF识别软件(WAFW00F)以及WAF绕过

    责任声明 本文章仅供学习交流使用 如有利用进行非法行为 上传者不承担任何责任 使用者后果自负 WAF防护分析 什么是WAF Web应用防护系统分为两种 软件与硬件 安全公司内部的为硬件 个人或小企业为软件 无论哪一种都是为web提供安全 存
  • 有效数字

    有效数字 数学上用 四舍五入 的法则将一个位数很多的数表示成一定位数的数 如果一个近似数的误差限是它某一位的半个单位 则称它准确到这一位 即该位数字是准确的 有效的和可靠的 并且 从该位起直到前面第一个非零数字为止的所有数字都称为有效数字
  • mysql ERROR: Error 1005: Can't create table (errno: 121)

    Q Executing SQL script in server ERROR Error 1005 Can t create table aquaticstar link errno 121 A I searched quickly for
  • 转:CDH5 集群安装教程

    一 虚拟机的安装和网络配置 1 虚拟机安装 2 安装CentOS 6 5 64位版本 桥接模式 Master 内存 3G 硬盘容量40G 4核 Slave 内存2G 硬盘容量30G 2核 3 网络配置 master slave 1 进入ro
  • 时序预测

    时序预测 MATLAB实现GM 1 1 灰色时间序列预测 目录 时序预测 MATLAB实现GM 1 1 灰色时间序列预测 预测效果 基本介绍 建模步骤 程序设计 学习总结 参考资料 预测效果 基本介绍 GM 1 1 模型的预测原理是 对某一
  • Linux修改主机名永久生效

    Linux centos7非此方法 修改主机名 永久生效 linux查看主机名 查看主机命令 root linux epm2 hostname localhost localdomain localhost localdomain即为默认的
  • 如何发布tms xdata server(sqlite)

    1 在fdconnection中将数据库路径设置成 employee db即可 2 在云服务上创建一个文件夹如d sparkle文件夹 3 复制exe sqlite3 dll employee db 数据库 运行 4 结果
  • html表单填写保存,如何从HTML表单读取输入并将其保存在文件中-Golang

    我试图建立一个非常简单的Web服务器 用户可以在其中访问站点并写入一个字符串和一个整数 然后我想保存这两个输入 我的想法是将其保存到一个文本文件中 该文件也可以显示在浏览器 textfile 我不知道关于SO的规范是多少代码可以发布 但是到
  • 【沧海拾昧】MATLAB/Simulink仿真的基本操作

    C0402 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 新建Simulink仿真 二 几种常用的模块和
  • 【Android】【移动应用开发】APP案列

    1 通讯录功能实现 页面布局代码如下 activity main xml 主界面布局代码
  • 职场上会用Python的人到底有多牛?

    这个人工智能崛起的时代 似乎人人都在聊 Python 从硬件的芯片层面 物联网 一路杀到云端 大数据 人工智能这些炙手可热的领域 无论什么领域 只要它需要编程 都会有Python的身影 下面就和大家一起来聊聊 Python 的好 到底它牛在
  • python3 tkinter 刷新标签图片

    coding utf 8 import tkinter as tk import os class RuKou tk Frame 登入的入口 将要做成运行时显示接口所返回的图片并展示 def init self master None 在这
  • Linux获取当前时间

    1 Linux下与时间有关的结构体 struct timeval int tv sec int tv usec 其中tv sec是由凌晨开始算起的秒数 tv usec则是微秒 10E 6 second struct timezone int
  • 在Markdown中用LaTeX/KaTeX输入公式-csdn

    在Markdown中用LaTeX输入公式 csdn Markdown语法简洁 LaTeX版面优美 相互配合 可以使用Markdown处理大多数的公式输入 LaTeX的教程中 刘海洋的 LaTeX入门 全面专业 其中第1章第2节的示例 杂谈勾
  • TCP之Delay Ack和Nagle算法

    TCP之Delay Ack和Nagle算法 1 Delay Ack TCP是可靠传输 可靠的核心是收到包后回复一个ack来告诉对方收到了
  • 推挽电路 MOS管、推挽输出和开漏输出

    专题5 硬件设计 之 48 推挽电路驱动MOS管 嵌入式工程师成长之路的博客 CSDN博客 推挽驱动 专题2 电子工程师 之 硬件 之 44 MOS管的功能特点 专题2 电子工程师 之 硬件 之 45 AON6244 MOS管数据手册分析
  • java 判断一个对象是否为空对象

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 最近项目中遇到一个问题 在用户没填数据的时候 我们需要接收从前端传过来的对象为null 但是前端说他们一个一个判断特别麻烦 只能传个空对象过来