如何判断一个对象的内容是否为空

Posted LarryZeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一个对象的内容是否为空相关的知识,希望对你有一定的参考价值。

原因

使用Controller的形参及注解@ModelAttribute来接收页面传来的数据,但是该形参类型中的属性过多,不想一一判断,就想有没有偷懒的方法。

搜索一番,找到一个不错的思路:利用反射获取所有字段,再判断内容是否为null。

 

初步代码如下

/**
 * 注意,如果order是null,也返回true。
 *
 * @param order
 * @return
 */
private boolean isOrderAllFieldNull(Order order){
    if(order == null){
        return true;
    }
    Class<Order> cls = Order.class;
    Field[] fields = cls.getDeclaredFields();
    for(Field field : fields){
        try{
            field.setAccessible(true);
            if(field.get(order)!=null){
                return false;
            }
        } catch(IllegalAccessException e){
        }
    }
    return true;
}

问题

上面的代码有不少问题,例如没考虑排除serialVersionUID,甚至没考虑基本类型是有默认值的,更没考虑Order中的属性可能设有默认值。。。

貌似离题万里了,但是因为这里需要的是判断页面有无传值进来,而不是真的判断Order对象的内容是否为空!

就是说,前面的出发点错了!囧

 

于是又写了代码如下(还是错的。。):

/**
     * 目的,判断是否有赋值。
     * 不能传入null对象!!!
     * 
     * @param obj
     * @return
     * @throws Exception
     */
    public <T> boolean isAllFieldStill(T obj) throws Exception {
        Class cls = obj.getClass();
        T t2 = (T) cls.getConstructor().newInstance();// 创建一个新的对象,用于对比数据
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 访问所有字段
            // if (field.getName().equals("serialVersionUID")) {// 无视掉序列化ID
            // continue;
            // }
            if (field.get(obj) != null) { // 卧槽,基本类型做不到啊
                if (field.getType().getName().equals("byte") || field.getType().getName().equals("short")
                        || field.getType().getName().equals("int") || field.getType().getName().equals("long")) {
                    // 判断
                    if ((int) field.get(obj) != (int) field.get(t2)) {
                        return false;
                    }
                } else if (field.getType().getName().equals("boolean")) {
                    // 判断
                    if ((boolean) field.get(obj) != (boolean) field.get(t2)) {
                        return false;
                    }
                } else if (field.getType().getName().equals("float")) {
                    // 判断
                    if ((float) field.get(obj) != (float) field.get(t2)) {
                        return false;
                    }
                } else if (field.getType().getName().equals("double")) {
                    // 判断
                    if ((double) field.get(obj) != (double) field.get(t2)) {
                        return false;
                    }
                } else {
                    // 都是引用类型了(引用类型需要有equals方法)
                    // 判断....
                    if (!field.get(obj).equals(field.get(t2))) {
                        return false;
                    }
                }
                return false;
            }

        }

        return true;
    }

 

写到上面的判断的时候,突然疯了。。。

于是有代码如下:

/**
 * 目的,判断是否有赋值。蛋疼,直接equals就行!!!强制要求重写equals即可。
 * 不能传入null对象!!!
 * 
 * @param obj
 * @return
 * @throws Exception
 */
public <T> boolean isAllFieldStill2(T obj) throws Exception {
    Class cls = obj.getClass();
    T t2 = (T) cls.getConstructor().newInstance();// 创建一个新的对象,用于对比数据

    if (t2.equals(obj)) {
        return true;
    } else {
        return false;
    }
}

然后想的是,我干嘛要这么麻烦,直接new个对象再equals一下不就得了。。。

 

结论就是

卧槽卧槽卧槽

况且况且况且

 

以上是关于如何判断一个对象的内容是否为空的主要内容,如果未能解决你的问题,请参考以下文章

如何判断Object对象不为空

C++中如何判断动态数组为空?要具体代码,谢谢

SQL数据库如何写判断数据为空就添加内容,有内容就更新,有相同内容就+1,这代码怎么写。

java 字符串为null 如何判断

freemarker中判断对象是不是为空

百度问问java如何判断对象是不是为空时,报空指针异常,如何解决?