js中如何判断一个对象是否为空对象,java中判断一个对象是否为空
最近项目出了点问题。当用户没有填写数据时,我们需要从前端接收空对象,但是前端说让他们一个一个判断特别麻烦,只能发一个空对象。我的第一个想法是,我可以通过反射来判断物体是否是空的。
第一版:
User.java
公共类用户{私有字符串用户名;私有布尔活动;私有长id;//省略get和set方法}ReflectUtil.java
public class reflect util { public static boolean isObjectNull(Object obj){ if(obj!=null) { Class?obj class=obj . getclass();method[]declared methods=obj class . getdeclaredmethods();if(declared methods . length 0){ int method count=0;get方法的个数int null value count=0;//对于(方法声明方法3360声明方法){ string name=declared method . getname(),结果为空;if(name . starts with( get ) name . starts with( is ){ method count=1;try { Object invoke=declared method . invoke(obj);if(invoke==null){ null value count=1;} } catch(IllegalAccessException InvocationTargetException e){ e . printstacktrace();} } }返回methodCount==nullValueCount} }返回false}}TestReflect.java
公共类test reflect { public static void main(String[]args){ User User=new User();system . out . println(reflect util . isobjectnull(user));}}结果:
真实的
获取类声明的方法第一个版本,判断如果方法以get开头或者是,就是get方法,然后通过反射调用改变方法获取结果,再判断结果是否为空。如果结果为null,则使用nullValueCount 1,最后返回结果为null的值的个数与get方法的个数的比较结果。如果两个数相同,则对象为空,否则不为空。第一版也可以判断对象是否为空,但前提是对象必须使用包装器类,没有默认值就不行。当然,你也可以根据类型和返回值的结果来判断一个对象是否为空,但是如果你想忽略一个属性而不做判断的话,改变它会有点麻烦。后来想知道spring的BeanUtils是怎么实现属性复制的,于是看了一下,发现了新的方法,于是有了第二版。
00-1010/* * *确定对象是否为空,* @ param obj * @ param ignore properties被忽略的属性* @return如果get方法的数量等于空属性的数量,则返回true,否则返回false */public static boolean为空对象(object obj
, String... ignoreProperties) throws IntrospectionException { if (obj != null) { Class<?> objClass = obj.getClass(); BeanInfo beanInfo = Introspector.getBeanInfo(objClass); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null); int count = 1; // 结果为空的属性数量 初始化为1 去除Object的getClass方法 int propertyCount = propertyDescriptors.length; // 属性数量 if (ignoreList != null){ propertyCount -= ignoreList.size(); } for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { Method readMethod = propertyDescriptor.getReadMethod(); String name = propertyDescriptor.getName(); if (readMethod != null && (ignoreList == null !ignoreList.contains(name))) { Class<?> returnType = readMethod.getReturnType(); String typeName = returnType.getSimpleName(); Object invoke = null; try { invoke = readMethod.invoke(obj); if (invoke == null) { count+=1; }else { switch (typeName) { case "String": if ("".equals(invoke.toString().trim())) { count += 1; } break; case "Integer": if ((Integer) invoke <= 0) { count += 1; } break; case "int": if ((int) invoke <= 0) { count += 1; } break; case "double": if ((double) invoke <= 0.0d) { count += 1; } break; case "Double": if ((Double) invoke <= 0.0D) { count += 1; } break; case "float": if ((float) invoke <= 0.0f) { count += 1; } break; case "Float": if ((Float) invoke <= 0.0F) { count += 1; } break; case "Long": if ((Long) invoke <= 0L) { count += 1; } break; case "long": if ((long) invoke <= 0L) { count += 1; } break; } } } catch (IllegalAccessException InvocationTargetException e) { e.printStackTrace(); } } } return propertyCount == count; } return true; }第一版和第二版思想基本都是一样的,都是通过读方法去判断返回值是否为空,只不过第二版在第一版上加强了可以忽略属性这个功能。通过spring 的beanutils发现PropertyDescriptor这个类,从名字看来是个属性描述器,描述属性相关的东西,通过属性描述器可以获取bean的属性名称,读写方法,使用起来还挺方便。通过Introspector内省类的静态方法getBeanInfo(Class<?> beanClass)获取BeanInfo,然后通过BeanInfo对象的getPropertyDescriptors()就可以返回属性描述器。由于没有太多研究就不多介绍了。
到此这篇关于java如何判断一个对象是否为空对象的文章就介绍到这了,更多相关java 判断对象是否为空内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。