Java 判断一个对象中某一个属性的值是否为空

2023-11-08

每次写博客都不知道咋开头…算了_ 直接说问题吧。就是验证一个对象中的一个属性的值是否为空。
自己在网上也找到了很多大神给的答案,有看到利用反射机制

public  boolean checkObjFieldIsNull(Object obj) throws IllegalAccessException {

    boolean flag = false;
    for(Field f : obj.getClass().getDeclaredFields()){
        f.setAccessible(true);
        log.info(f.getName());
        if(f.get(obj) == null){
            flag = true;
            return flag;
        }
    }
    return flag;
}

上面这一段代码,可以检验这个对象中是否有空值,但我想要的结果是判断其中的一个属性是否为空。显然这段神奇的代码解决不了问题。

问题显然已经说清楚了,下面说一下答案!

首先我需要检验的对象是一个Student类,并且Student类继承了Person类。代码如下所示

public class Person {
    //姓名
    private String name;
    //性别
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}
public class student extends Person {
    //学号
    private String snum;
    // 学院
    private String scoll;
    // 班级
    private String sclass;

    public String getSnum() {
        return snum;
    }

    public void setSnum(String snum) {
        this.snum = snum;
    }

    public String getScoll() {
        return scoll;
    }

    public void setScoll(String scoll) {
        this.scoll = scoll;
    }

    public String getSclass() {
        return sclass;
    }

    public void setSclass(String sclass) {
        this.sclass = sclass;
    }

    @Override
    public String toString() {
        return "student{" +
                "snum='" + snum + '\'' +
                ", scoll='" + scoll + '\'' +
                ", sclass='" + sclass + '\'' +
                '}';
    }
}

前方高能~~~

public class Test {

    public static void main(String[] args) {
        student student = new student();
        student.setName("这是姓名");//父类中的属性
        student.setSnum("这是学号");
        Map<String, Object> map = objToMap(student);
        System.out.println(null == map.get("name"));//不是空
        System.out.println(null == map.get("age"));//是空的
        System.out.println(null == map.get("snum"));//不是空的
        System.out.println(null == map.get("scoll"));//是空的

    }


    //将对象转成map
    private static Map<String, Object> objToMap(Object obj) {
        Map<String, Object> map = new HashMap<String, Object>();
        // 获取f对象对应类中的所有属性域
        Field[] fields = getAllFields(obj);
        for (int i = 0, len = fields.length; i < len; i++) {
            String varName = fields[i].getName();
            varName = varName.toLowerCase();//将key置为小写,默认为对象的属性
            try {
                // 获取原来的访问控制权限
                boolean accessFlag = fields[i].isAccessible();
                // 修改访问控制权限
                fields[i].setAccessible(true);
                // 获取在对象f中属性fields[i]对应的对象中的变量
                Object o = fields[i].get(obj);
                if (o != null)
                    map.put(varName, o.toString());
                // System.out.println("传入的对象中包含一个如下的变量:" + varName + " = " + o);
                // 恢复访问控制权限
                fields[i].setAccessible(accessFlag);
            } catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
        return map;
    }

    /**
     * 返回对象的Field(包括私有的和父类的)
     */
    public static Field[] getAllFields(Object object) {
        Class clazz = object.getClass();
        List<Field> fieldList = new ArrayList<>();
        while (clazz != null) {
            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
            clazz = clazz.getSuperclass();
        }
        Field[] fields = new Field[fieldList.size()];
        fieldList.toArray(fields);
        return fields;
    }
}

解释一下:我先将一个对象转换成了一个map,然后通过key返回值判断是否为空,在这里使用objToMap()将对象转换成map,因为我的这个对象是集成的Person类,(通过getClass()方法来获取类的定义信息,通过定义信息再调用getFields()方法来获取类的所有公共属性,或者调用getDeclaredFields()方法来获取类的所有属性,包括公共,保护,私有,默认的方法,但是这里有一点要注意的是这个方法只能获取当前类里面显示定义的属性),所以我有使用了getAllFields()获取一个对象的所有属性。

运行程序得到结果为

false
true
false
true

下面在贴一下大神的回复,更便捷的方式

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

Java 判断一个对象中某一个属性的值是否为空 的相关文章

  • java try catch 程序流程什么时候中断?

    你好 我对 Java 中的异常处理不太熟悉 所以 正如主题在基本 try catch 块中所述 当我在 Try 块中捕获异常时 程序流程何时中断 try some code that raises an Exception catch Ex
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 全静态方法和应用单例模式有什么区别?

    我正在创建一个数据库来存储有关我的网站用户的信息 我正在使用 stuts2 因此使用 Java EE 技术 对于数据库 我将创建一个 DBManager 我应该在这里应用单例模式还是将其所有方法设为静态 我将使用这个 DBManager 进
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • Servlet 调度程序当前不可用

  • java中日期转换dd-MMM-yyyy到dd-MM-yyyy

    在Java中将23 Mar 2011转换为23 03 2011的最简单方法是什么 感谢大家 这似乎解决了这个问题 try Calendar cal Calendar getInstance cal setTime new SimpleDat
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • Lucene/Hibernate 搜索锁定异常

    我使用 Hibernate Search 在 Web 应用程序上索引和全文搜索项目 没有问题 来自我的 pom xml
  • 如何列出Resources文件夹中的所有文件(java/scala)

    我正在编写一个函数 需要访问资源中的文件夹 并循环遍历所有文件名 如果这些文件符合条件 则加载这些文件 new File getClass getResource images sprites getPath listFiles 返回空指针
  • 获取Java中ResultSet返回的行数

    我用过一个ResultSet返回一定数量的行 我的代码是这样的 ResultSet res getData if res next System out println No Data Found while res next code t
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • https 访问 iframe 的http

    最近做的项目要求https 嵌入http的项目 浏览器老是提示https不能访问http 为了满足需求 在本地项目中添加了nginx转发服务 将项目中的iframe 转发为https 再又nginx将https转发至http 满足需求了 n
  • 1. 经验累积分布函数

    为了说明经验累积分布函数 我们这里使用一个学生成绩的数据集 假设班有50名学生 这些学生刚刚进行了一个测试 这个测试的结果是以0 100的分数来体现的 我们要如何更好的可视化结果呢 例如确定成绩的最大值和最小值 对于这个数据的可视化 我们可
  • jar包修改并重新打包,jar包反编译使用工具以及修改代码方法

    jar包修改并重新打包 jar包反编译使用工具以及修改代码方法 备忘 https blog csdn net tomcat zhu article details 79240011
  • unity中的reflectionProbe的使用

    下面说一下Reflection Probe 大家都知道 当使用标准着色器时 每一个材质都会具有一定程度的镜面反射 specularity 和金属反射 metalness 属性 在没有强大的硬件来处理即时光迹追踪反射的情况下 我们得仰赖预先计
  • 8.bidirectional_recurrent_neural_network

    import torch import torch nn as nn import torchvision import torchvision transforms as transforms device torch device cu
  • 电源升降压芯片电路归纳(归纳中。。。)

    注 学习硬件做的总结 大神勿喷 有不足之处还望不吝赐教 目录 电源升压5v芯片归纳 PS7516电路 NCP1400ASN50电路 PL2628电路 FP6276B电路 PL2303电路 PS3120A电路 QX2301LXXE电路 电源升
  • Opencv快速入门教程,Python计算机视觉基础

    快速入门 OpenCV 是 Intel 开源计算机视觉库 它由一系列 C 函数和少量 C 类构成 实现了图像处理和计算机视觉方面的很多通用算法 OpenCV 拥有包括 300 多个 C 函数的跨平台的中 高层 API 它不依赖于其它的外部库
  • 用java解一元二次方程组

    System out print 求 ax 2 bx c 0的根 n Scanner in new Scanner System in 定义变量 while true System out println 请输入a的值 int a in n
  • RT-Thread开发GD32F450 添加adc外设

    开发板使用的是gd32f450zk env工具使用的版本是1 3 5 rtthread版本是5 0 0 添加adc外设的步骤如下 步骤1 查看开发板的电路原理图 确定adc的使用引脚 使用的是引脚PF6 即adc012 IN4 如下图 步骤
  • 设计模式:状态机模式

    首先状态机模式是处理一个类在内部状态改变的时候 其方法处理信息的模式也会改变 这里说一个在RTS游戏里的应用 有限状态机 我们要赋予每个战斗单位一个智能 比如一定范围内检测到地方单位 且自身处于游荡或者Patrol状态 那么就转换为攻击状态
  • [MAC各类右键菜单修改]Automator WorkFlow: 扩展右键菜单

    一 前 废 言 话 Automator是我最喜欢的OS X预装程序之一 能轻松以简单的拖拽创建一个工作流程 WorkFlow 也能用AppleScript和终端Shell辅助完成操作 这篇帖子主要分享我最近写的一些Automator工作流程
  • JAVA NIO 基础

    原文地址 http www iteye com topic 834447 1 基本 概念 IO 是主存和外部设备 硬盘 终端和网络等 拷贝数据的过程 IO 是操作系统的底层功能实现 底层通过 I O 指令进行完成 所有语言运行时系统提供执行
  • 六、ARP协议

    一 ARP 地址解析协议 Address Resolution Protocol 是将IP地址解析为MAC地址的协议 ARP没有IP封装 Type为0X0806 ARP不能穿越路由器 不能被转发到其他广播域 ARP分为 1 正向ARP IP
  • mpvue的入门

    奔三路学习网移动版 首页 vue面试通 前端面试通 大前端知识 挨踢职场 找前端工作 搜索 主页 gt vue面试通 gt 开源框架 gt mpvue菜鸟踩坑吃鸡篇一 时间 2018 04 25 11 46 来源 未知 作者 admin 点
  • mysql show table column_Mysql 常用show命令 show table-奇乐网

    Mysql 常用show命令 show tables或show tables from database name或show database name tables 解释 显示当前数据库中所有表的名称 show databases 解释
  • leetcode 535. Encode and Decode TinyURL(对URL编解码)

    Note This is a companion problem to the System Design problem Design TinyURL TinyURL is a URL shortening service where y
  • 搞懂一般的stacking和blending只需一张图片

    搞懂一般的stacking和blending只需一张图片 搞不懂我把这张图片的纸吃了 下面再简单参考一下其他博主的对于这两种集成方法的比较 Blending的优点在于 1 比stacking简单 因为不用进行k次的交叉验证来获得stacke
  • postgresql用sql语句查询表结构

    用到的postgresql系统表 关于postgresql系统表 可以参考PostgreSQL 8 1 中文文档 系统表 pg class 记录了数据库中的表 索引 序列 视图 关系 其中比较重要字段有 relname 表 索引 视图等的名
  • JsRPC生成某乎3.0版x-zse-96学习分析,网站:aHR0cHM6Ly93d3cuemhpaHUuY29tLw==

    一 jsrpc工具 用的是github上一位大神所写的工具 里面有写具体用法 https github com jxhczhl JsRpc 点进去下载安装包 下载本地版 https wss版本需要在当前目录放证书 下载后直接双击运行 开启服
  • Java 判断一个对象中某一个属性的值是否为空

    每次写博客都不知道咋开头 算了 直接说问题吧 就是验证一个对象中的一个属性的值是否为空 自己在网上也找到了很多大神给的答案 有看到利用反射机制 public boolean checkObjFieldIsNull Object obj th