zoukankan      html  css  js  c++  java
  • Java判断对象是否为NULL

    Java使用反射判断对象是否为NULL

    判断Java对象是否为null可以有两层含义:

    第一层:  直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候返回false。

    第二层:在object != null 为true的情况 下,进一步去判断对象的所有属性是否为null。

    被判断的Java对象: User (User.java)

    package com.chinalife.utils;
    
    import java.util.List;
    
    public class User {
    
        private  String  name; //姓名
        private String age; //年龄
        private String sex; //性别
        private List<String> hobbies; // 爱好
        private boolean isStudent; //是否是学生
        
        public  User(){}
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public List<String> getHobbies() {
            return hobbies;
        }
    
        public void setHobbies(List<String> hobbies) {
            this.hobbies = hobbies;
        }
    
        public boolean isStudent() {
            return isStudent;
        }
    
        public void setStudent(boolean isStudent) {
            this.isStudent = isStudent;
        }
        
    }
    View Code

    一、简单判断:

    //判断1  : 这里会返回 true
    User user = null; if(user == null){ return true; }else{ return false; } //判断2 : 这里会返回 false User user = new User(); if(user == null){ return true; }else{ return false; }

    原因: User user = new User(); 这时候已经创建了一个对象,所以user不会为null

    以上示例比较简单,一目了然,看起来没有任何问题。 

    " 但是其实当你需要判断的对象为前端传过来的对象时,单纯的使用 object == null 去判断是不够的,因为前端传过来的对象会是 判断2 的样子。

    对象不为null,但是对象的所有属性均为null[boolean类型除外,以及序列化值除外,可能还有其他特殊值~ 欢迎补充哟] "

    " " 所标识的内容如果不够清晰,请参考上一篇博客: https://www.cnblogs.com/DFX339/p/9896476.html 

    二、进一步判断:

    创建Util类,使用反射对对象的属性进行判断  

    CheckObjectIsNullUtils.java

    package com.chinalife.proposal.common.util;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Type;
    
    /**
     * <p>Description: 判断对象是否为空,进一步判断对象中的属性是否都为空 </p>
     * @author duanfeixia
     * @date 2018年11月12日
     */
    public class CheckObjectIsNullUtils {
        
        /**
         * 判断对象是否为空,且对象的所有属性都为空
         * ps: boolean类型会有默认值false 判断结果不会为null 会影响判断结果
         *     序列化的默认值也会影响判断结果
         * @param object
         * @return
         */
        public  boolean objCheckIsNull(Object object){
            Class clazz = (Class)object.getClass(); // 得到类对象
            Field fields[] = clazz.getDeclaredFields(); // 得到所有属性
            boolean flag = true; //定义返回结果,默认为true
            for(Field field : fields){
                field.setAccessible(true);
                Object fieldValue = null;
                try {
                    fieldValue = field.get(object); //得到属性值
                    Type fieldType =field.getGenericType();//得到属性类型
                    String fieldName = field.getName(); // 得到属性名
                    System.out.println("属性类型:"+fieldType+",属性名:"+fieldName+",属性值:"+fieldValue);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if(fieldValue != null){  //只要有一个属性值不为null 就返回false 表示对象不为null
                    flag = false;
                    break;
                }
            }
            return flag;
        }
        
    }

     

    1>>>首先我们测试一个含有boolean类型属性的对象判断  (被判断的User对象为文章最上方的User.java)

    测试类1:

    package com.chinalife.utils;
    
    import org.junit.Test;
    
    import com.chinalife.proposal.common.util.CheckObjectIsNullUtils;
    
    /**
     * <p>Description:测试对象判空 </p>
     * @author duanfeixia
     * @date 2018年11月12日
     */
    public class CheckObjectIsNullUtilsTest {
    
        @Test
        public void  testObjectCheck(){
            CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils();
            User user= new User();
            boolean flag1 = checkUtils.objCheckIsNull(user);
            System.err.println("是否为空:"+flag1);
        }
    }

    测试结果1: 这里是受boolean类型值的影响,所以返回的结果为false

    2>>>接下来将User对象的boolean类型属性去掉,再测试User对象的判断

    User.java 如下:

    package com.chinalife.utils;
    
    import java.util.List;
    
    public class User {
    
        private  String  name; //姓名
        private String age; //年龄
        private String sex; //性别
        private List<String> hobbies; // 爱好
    //    private boolean isStudent; //是否是学生
        
        public  User(){}
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public List<String> getHobbies() {
            return hobbies;
        }
    
        public void setHobbies(List<String> hobbies) {
            this.hobbies = hobbies;
        }
    
    //    public boolean isStudent() {
    //        return isStudent;
    //    }
    //
    //    public void setStudent(boolean isStudent) {
    //        this.isStudent = isStudent;
    //    }
        
    }

    测试类2:(和上面的一样)

    package com.chinalife.utils;
    
    import org.junit.Test;
    
    import com.chinalife.proposal.common.util.CheckObjectIsNullUtils;
    
    /**
     * <p>Description:测试对象判空 </p>
     * @author duanfeixia
     * @date 2018年11月12日
     */
    public class CheckObjectIsNullUtilsTest {
    
        @Test
        public void  testObjectCheck(){
            CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils();
            User user= new User();
            boolean flag1 = checkUtils.objCheckIsNull(user);
            System.err.println("是否为空:"+flag1);
        }
    }

     

     测试结果2: 【返回的是true,因为注释掉了Boolean类型的属性

    这里需要注意的是数据类型: boolean与Boolean

    boolean 定义的变量默认值为false,Boolean定义的变量默认值为 null.

    ps: 在定义boolean类型变量时,最好不要使用 isXxx,因为默认生成的get方法就是 isXxx(), RPC框架在反向解析的时候,以为对应的属性名是 xxx,从而导致属性获取不到,抛出异常。

    eg:定义boolean属性 boolean isSuccess;  

    对应的boolean类型获取数据的方法:

    public String isSuccess(){

      return isSuccess;

    }

    RPC框架在反向解析的时候,以为对应的属性名是 success 从而导致属性获取不到,抛出异常。

    3>>>然后我们再来测试一下关于实实现序列化接口 Serializable 时的结果:

    User.java 如下

    package com.chinalife.utils;
    
    import java.util.List;
    //implements  java.io.Serializable 
    public class User implements  java.io.Serializable {
    
        private static final long serialVersionUID = 1L;
        private  String  name; //姓名
        private String age; //年龄
        private String sex; //性别
        private List<String> hobbies; // 爱好
        
        public  User(){}
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public List<String> getHobbies() {
            return hobbies;
        }
    
        public void setHobbies(List<String> hobbies) {
            this.hobbies = hobbies;
        }
        
    }

    测试类3:

    package com.chinalife.utils;
    
    import org.junit.Test;
    
    import com.chinalife.proposal.common.util.CheckObjectIsNullUtils;
    
    /**
     * <p>Description:测试对象判空 </p>
     * @author duanfeixia
     * @date 2018年11月12日
     */
    public class CheckObjectIsNullUtilsTest {
    
        @Test
        public void  testObjectCheck(){
            CheckObjectIsNullUtils checkUtils= new CheckObjectIsNullUtils();
            User user= new User();
            boolean flag1 = checkUtils.objCheckIsNull(user);
            System.err.println("是否为空:"+flag1);
        }
    }

    测试结果3:结果为false,因为serialVersionUID有值

    综上所述,当你需要判断Java对象是否为null的时候,你可以先通过 obj == null 去判断,如果obj 不等于null,再根据业务需求决定是否需要进一步判断 obj的所有属性是否都为null。

    主要方法是: CheckObjectIsNullUtils.java 类中所示的内容。

    需要注意的是: 当你的对象 实现了序列化接口或者是含有boolean类型的属性时 ,你要处理好是否要忽略这个两种类型的值。

     

  • 相关阅读:
    C#之获取本地IP地址
    C#中对Excel进行操作
    C#中的TCP通讯与UDP通讯
    Flex 学习
    正则表达式实例
    sass调试--页面看到sass文件而不是css文件问题
    webpack+vue-loader 在单独.vue组件中使用sass-loader编译sass报错问题not a valid Win32 applictation
    SVG图案填充-Pattern
    jQuery小技巧
    代码整洁一
  • 原文地址:https://www.cnblogs.com/DFX339/p/9945771.html
Copyright © 2011-2022 走看看