每次写博客都不知道咋开头...算了_ 直接说问题吧。就是验证一个对象中的一个属性的值是否为空。
自己在网上也找到了很多大神给的答案,有看到利用反射机制
public boolean checkObjFieldIsNull(Object obj) throws IllegalAccessException {
boolean flag = false;
for(Field f : obj.getClass().getDeclaredFields()){
f.setAccessible(true);
log.info(f.getName());
if(f.get(obj) == null){
flag = true;
return flag;
}
}
return flag;
}
上面这一段代码,可以检验这个对象中是否有空值,但我想要的结果是判断其中的一个属性是否为空。显然这段神奇的代码解决不了问题。
问题显然已经说清楚了,下面说一下答案!
首先我需要检验的对象是一个Student类,并且Student类继承了Person类。代码如下所示
public class Person {
//姓名
private String name;
//性别
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
public class student extends Person {
//学号
private String snum;
// 学院
private String scoll;
// 班级
private String sclass;
public String getSnum() {
return snum;
}
public void setSnum(String snum) {
this.snum = snum;
}
public String getScoll() {
return scoll;
}
public void setScoll(String scoll) {
this.scoll = scoll;
}
public String getSclass() {
return sclass;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
@Override
public String toString() {
return "student{" +
"snum='" + snum + '\'' +
", scoll='" + scoll + '\'' +
", sclass='" + sclass + '\'' +
'}';
}
}
前方高能~~~
public class Test {
public static void main(String[] args) {
student student = new student();
student.setName("这是姓名");//父类中的属性
student.setSnum("这是学号");
Map<String, Object> map = objToMap(student);
System.out.println(null == map.get("name"));//不是空
System.out.println(null == map.get("age"));//是空的
System.out.println(null == map.get("snum"));//不是空的
System.out.println(null == map.get("scoll"));//是空的
}
//将对象转成map
private static Map<String, Object> objToMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
// 获取f对象对应类中的所有属性域
Field[] fields = getAllFields(obj);
for (int i = 0, len = fields.length; i < len; i++) {
String varName = fields[i].getName();
varName = varName.toLowerCase();//将key置为小写,默认为对象的属性
try {
// 获取原来的访问控制权限
boolean accessFlag = fields[i].isAccessible();
// 修改访问控制权限
fields[i].setAccessible(true);
// 获取在对象f中属性fields[i]对应的对象中的变量
Object o = fields[i].get(obj);
if (o != null)
map.put(varName, o.toString());
// System.out.println("传入的对象中包含一个如下的变量:" + varName + " = " + o);
// 恢复访问控制权限
fields[i].setAccessible(accessFlag);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
return map;
}
/**
* 返回对象的Field(包括私有的和父类的)
*/
public static Field[] getAllFields(Object object) {
Class clazz = object.getClass();
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
return fields;
}
}
解释一下:我先将一个对象转换成了一个map,然后通过key返回值判断是否为空,在这里使用objToMap()
将对象转换成map,因为我的这个对象是集成的Person类,(通过getClass()方法来获取类的定义信息,通过定义信息再调用getFields()方法来获取类的所有公共属性,或者调用getDeclaredFields()方法来获取类的所有属性,包括公共,保护,私有,默认的方法,但是这里有一点要注意的是这个方法只能获取当前类里面显示定义的属性),所以我有使用了getAllFields()
获取一个对象的所有属性。
运行程序得到结果为
false
true
false
true