😀大家好!我是向阳🌞,一个想成为优秀全栈开发工程师的有志青年!
📔今天给大家介绍的是如何利用反射来判断一个实体类中的部分属性是否为空(或者不为空)
问题
今天在写一个项目的业务时,要计算一个企业对应的安全分数,其中一个标准是企业对应的部分信息是否填写完整来评判分数,就拿下图中的这几个信息来说吧。
思考
我们首先想到的办法是获取到这个企业实体类后来判断这几个属性是否为空,来获得分数。
// 企业资源评分
int score = 0;
EnterpriseInfo enterpriseInfo = enterpriseInfoMapper.selectById(enterpriseId);
if (enterpriseInfo != null) {
if (enterpriseInfo.getEmail() != null && !enterpriseInfo.getEmail().isEmpty()) {
score += 1;
}
// 后面的判断属性跟上面写法一样
}
可是如果我们要判断的属性很多呢,难道要一直这么if判断下去吗?这会使我们的代码显得太臃肿了。
这个时候我们可以想到使用反射,反射可以获取该实体类的所有属性信息,但是我们需要判断部分信息是否为空,我们可以创建一个Set集合,Set集合中写上我们需要判断的属性。
我们来写一个方法,接收两个参数,一个是实体类,另一个是一个Set集合。
public Long countNonNullProperties(Object obj, Set<String> fieldNames) {
}
我们通过接收的实体类,来反射获得他的所有属性。同时我们Set集合来筛选出我们想要的实体类属性。判断筛选出来的属性是否有值,这样就大功告成了!
long nonNullCount = 0;
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields(); // 获取该实体类的所有属性
for (Field field : fields) {
if (fieldNames.contains(field.getName())) {
field.setAccessible(true); // 使私有属性可访问
try {
Object value = field.get(obj); // 判断是否有值
if (value != null) {
nonNullCount++;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
最后附上整个方法的完整代码。
代码
public Long countNonNullProperties(Object obj, Set<String> fieldNames) {
if (fieldNames == null || fieldNames.isEmpty()) {
throw new IllegalArgumentException("fieldNames不能为空");
}
long nonNullCount = 0;
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (fieldNames.contains(field.getName())) {
field.setAccessible(true); // 使私有属性可访问
try {
Object value = field.get(obj);
if (value != null) {
nonNullCount++;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return nonNullCount;
}
——👦[作者]:向阳256
——⏳[更新]:2024.08.23
——🥰本人技术有限,如果有不对指正需要更改或者有更好的方法,欢迎到评论区留言