java如何判断⼀个对象是否为空对象
最近项⽬中遇到⼀个问题,在⽤户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们⼀个⼀个判断特别⿇烦,只能传个空对象过来,我第⼀个想法就是可以通过反射来判断对象是否为空。
第⼀版:
Ur.java
public class Ur {
private String urname;
private Boolean active;
private Long id;
// 省略get和t⽅法
}
ReflectUtil.java
public class ReflectUtil {
public static boolean isObjectNull(Object obj){
if (obj != null) {
Class<?> objClass = Class();
Method[] declaredMethods = DeclaredMethods();
if (declaredMethods.length > 0) {
int methodCount = 0; // get ⽅法数量
int nullValueCount = 0; // 结果为空
for (Method declaredMethod : declaredMethods) {
String name = Name();
周一综合症
if (name.startsWith("get") || name.startsWith("is")){
methodCount += 1;
bluetooth是什么意思try {
Object invoke = declaredMethod.invoke(obj);
if (invoke == null) {
nullValueCount += 1;
}
} catch (IllegalAccessException | InvocationTargetException e){
e.printStackTrace();
}
}
钢铁侠3影评}
return methodCount == nullValueCount;
}
}
return fal;
}
}
TestReflect.java
public class TestReflect {
public static void main(String[] args) {
Ur ur = new Ur();
System.out.println(ReflectUtil.isObjectNull(ur));
儿童英文歌
}
}
结果:
true
第⼀版获取⼀个类的声明的⽅法,判断⽅法如果以get或者is开头就是get⽅法,然后通过反射调⽤改⽅法获取结果,再判断结果是否为空,如果结果为null的话就把nullValueCount+1,最后返回结果为空的值的数量和get⽅法数量⽐较的结果,如果两者数量相同则说明该对象为空,反之不为空。
第⼀版也可以判断⼀个对象是否为空,但前提是对象必须使⽤包装类,没有默认值的就不⾏了,当然你也可以根据类型和返回值结果来判断对象是否为空,但是如果想忽略某个属性不做判断,改起来就有点⿇烦了。后来想知道spring 的BeanUtils 是怎么实现属性复制的就看了⼀下,发现了新的⽅法,于是就有了第⼆版。
第⼆版:
/**
* 判断对象是否为空,
* @param obj
* @param ignoreProperties 忽略的属性
* @return 如果get ⽅法的数量等于属性为空的数量返回true,否则fal
*/
public static boolean isNullObject(Object obj , ignoreProperties) throws IntrospectionException { if (obj != null) {
Class<?> objClass = Class();
BeanInfo beanInfo = BeanInfo(objClass);
PropertyDescriptor[] propertyDescriptors = PropertyDescriptors();
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 = ReadMethod();
String name = Name();
if (readMethod != null && (ignoreList == null || !ains(name))) {
Class<?> returnType = ReturnType();
多的拼音
String typeName = SimpleName();
toobigtofailObject invoke = null;
try {
invoke = readMethod.invoke(obj);
if (invoke == null) {
父亲节快乐英文怎么写
count+=1;
genuine是什么意思}el {
switch (typeName) {
ca "String":
if ("".String().trim())) {
count += 1;
}
break;
ca "Integer":
if ((Integer) invoke <= 0) {
count += 1;
}
break;
ca "int":
if ((int) invoke <= 0) {
count += 1;
}
break;
ca "double":
if ((double) invoke <= 0.0d) {produce是什么意思
count += 1;
}
break;
ca "Double":
if ((Double) invoke <= 0.0D) {
count += 1;
}
break;
ca "float":
if ((float) invoke <= 0.0f) {
count += 1;
}
break;
ca "Float":
if ((Float) invoke <= 0.0F) {
count += 1;
}
break;
ca "Long":
if ((Long) invoke <= 0L) {
count += 1;
}
break;
ca "long":
if ((long) invoke <= 0L) {
count += 1;
}
break;
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
return propertyCount == count;
}
return true;
}bearded
第⼀版和第⼆版思想基本都是⼀样的,都是通过读⽅法去判断返回值是否为空,只不过第⼆版在第⼀版上加强了可以忽略属性这个功能。
通过spring 的beanutils发现PropertyDescriptor这个类,从名字看来是个属性描述器,描述属性相关的东西,通过属性描述器可以获取bean的属性名称,读写⽅法,使⽤起来还挺⽅便。
通过Introspector内省类的静态⽅法getBeanInfo(Class<?> beanClass)获取BeanInfo,然后通过BeanInfo对象的getPropertyDescriptors()就可以返回属性描述器。
由于没有太多研究就不多介绍了。
到此这篇关于java如何判断⼀个对象是否为空对象的⽂章就介绍到这了,更多相关java 判断对象是否为空内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!