原因
使用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一下不就得了。。。
结论就是
卧槽卧槽卧槽
况且况且况且
时间: 2024-11-03 10:51:48