Java 优雅判断对象属性值是否为空
每次写博客都不知道咋开头...算了_ 直接说问题吧。就是验证一个对象中的一个属性的值是否为空。
自己在网上也找到了很多大神给的答案,有看到利用反射机制
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2017-06-12 Redis数据更新