标签:ack 无法 场景 use one lan imp 存在 comm
此处的FieldUtils来自org.apache.commons.lang3.reflect包,实际使用中他比单纯使用jdk中的api要方便的多:一是代码两少,二是提供一些额外的功能。原则就是,有轮子就用轮子,没必要自己造轮子,尤其是一些工具类,像common包里的这些工具类。
在某些场景下我们需要获取父类的某些属性,这时使用jdk的api getDeclaredFields()就无法实现,getDeclaredFields()只能拿到当前class的属性,当然也有其它方法来实现,但FieldUtils提供了一种非常简洁的方式:
package test; import com.fasterxml.jackson.annotation.JsonFormat; public class User extends Person { @JsonFormat String phoneNum; public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } }
package test; public class Person { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
上述为存在继承关系的两个类,下面看例子:
package test; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.commons.lang3.reflect.FieldUtils; import java.lang.reflect.Field; public class FieldUtilsDemo { public static void main(String[] args) { //获取属性 Field[] declaredFields = User.class.getDeclaredFields(); for (Field field : declaredFields) { System.out.println("jdk api:" + field.getName()); } //获取父类的属性 Field[] fields = FieldUtils.getAllFields(User.class); for (Field field : fields) { System.out.println("FieldUtils获取" + field.getName()); } } }
打印结果:
jdk api:phoneNum
FieldUtils获取phoneNum
FieldUtils获取name
FieldUtils获取age
看代码比较一下两种方式,在上述User类的phineNum属性上有一个JsonFormat注解,我们获取所有带有JsonFormat注解的属性。
package test; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.commons.lang3.reflect.FieldUtils; import java.lang.reflect.Field; public class FieldUtilsDemo { public static void main(String[] args) { //jdk方式 Field[] declaredFields = User.class.getDeclaredFields(); for (Field field : declaredFields) { if (field.isAnnotationPresent(JsonFormat.class)) { System.out.println("jdk api:" + field.getName()); } } //FieldUtils获取带注解的属性 Field[] annotationFields = FieldUtils.getFieldsWithAnnotation(User.class, JsonFormat.class); for (Field field : annotationFields) { System.out.println("FieldUtils获取"+field.getName()); } } }
打印結果:
jdk api:phoneNum
FieldUtils获取phoneNum
可以看出FieldUtils.getFieldsWithAnnotation非常方便。
标签:ack 无法 场景 use one lan imp 存在 comm
原文地址:https://www.cnblogs.com/silenceshining/p/13270098.html