用反射判斷實體類的屬性是否為null(附帶註解版本)
阿新 • • 發佈:2019-01-04
這個是用來驗證表單傳來的json物件裡是否必填,如果值為null或者“”時返回屬性的名字
程式碼
/**
* java反射機制判斷物件所有屬性是否全部為空
* @param obj
* @return 返回屬性名稱
*/
public static String checkObjFieldIsNotNull(Object obj,String remark){
try {
for (Field f : obj.getClass().getDeclaredFields()) {
f.setAccessible(true );
if(f.getName().equals(remark)){
continue;
}
if (f.get(obj) == null || f.get(obj) == "") {
return f.getName();
}
}
}catch (Exception e){
return null;
}
return null;
}
如果只需要返回boolean型別可以改成下面這種
/**
* java反射機制判斷物件所有屬性是否全部為空
* @param obj
* @return 返回屬性名稱
*/
public static boolean checkObjFieldIsNotNull(Object obj,String remark){
try {
for (Field f : obj.getClass().getDeclaredFields()) {
f.setAccessible(true );
if(f.getName().equals(remark)){
continue;
}
if (f.get(obj) == null || f.get(obj) == "") {
return false;
}
}
}catch (Exception e){
return false;
}
return true;
}
之後遇到有些物件執行某些成員屬性w為null,採用上面的方法就有點不可用了,所有采用了一種註解的方式
在類屬性上新增@AllowNull,則可以執行這個屬性為null。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AllowNull {
String value() default "";
}
判斷方法
/**
* 通過實體類中添加註解來判斷是否物件是否可以為null
* @param obj
* @return
*/
public static Boolean checkNotNull(Object obj) {
try {
Class<?> clazz = obj.getClass();
//獲得私有的成員屬性
Field[] fields = clazz.getDeclaredFields();
if(fields!=null && fields.length>0){
for(Field f : fields){
f.setAccessible(true);
//判斷AllowNull註解是否存在
if(f.isAnnotationPresent(AllowNull.class)){
continue;
}else {
if(f.get(obj)==null || "".equals(f.get(obj))){
return false;
}
}
}
}
} catch (IllegalAccessException e) {
return false;
}
return true;
}
最後測試
public class AnnoTest {
@AllowNull
private String name;
public static void main(String[] args) {
AnnoTest annoTest = new AnnoTest();
Boolean aBoolean = ReflectUtils.checkNotNull(annoTest);
System.out.println(aBoolean);
}
}
輸出結果
結果輸出true