【類字段工具類】FieldUtils

這裏使用的是:3.9 的版本,還是比較新的

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
     <version>3.9</version>
</dependency>

 

 

Field getField(Class<?> cls, String fieldName) 獲取指定字段名的公共字段,包括繼承/實現的公共的字段

Field getField(final Class<?> cls, String fieldName, boolean forceAccess)

獲取指定字段名的字段(無論私有還是公共),包括繼承/實現的公共的或私有的字段

Field templateName = FieldUtils.getField(QcTemplate.class, "templateName");
System.out.println(templateName); // null

Field orgId = FieldUtils.getField(QcTemplate.class, "orgId", true);
System.out.println(orgId); // private java.lang.String com.hbsc.domain.QcTemplate.orgId

 

Field getDeclaredField(final Class<?> cls, final String fieldName) 獲取指定字段名的公共字段,只獲取當前類

Field getDeclaredField(Class<?> cls, String fieldName, boolean forceAccess)

獲取指定字段名的字段,只獲取當前類(無論私有還是公共),繼承/實現的獲取不到

Field templateName = FieldUtils.getDeclaredField(QcTemplate.class, "templateName");
System.out.println(templateName); // null

Field page = FieldUtils.getDeclaredField(QcTemplate.class, "page", true);
System.out.println(page); // null


Field[] getAllFields(final Class<?> cls) 獲取所有字段,返回一個數組

Field[] allFields = FieldUtils.getAllFields(QcTemplate.class);
Arrays.stream(allFields).forEach(System.out::println);
// private static final long com.hbsc.domain.QcTemplate.serialVersionUID
// private java.lang.String com.hbsc.domain.QcTemplate.caseStatus
// private java.lang.String com.hbsc.domain.common.BaseBo.userName


List<Field> getAllFieldsList(final Class<?> cls) 獲取所有字段,返回一個集合

List<Field> allFieldsList = FieldUtils.getAllFieldsList(QcTemplate.class);
allFieldsList.forEach(System.out::println);
// private static final long com.hbsc.domain.QcTemplate.serialVersionUID
// private java.lang.String com.hbsc.domain.QcTemplate.caseStatus
// private java.lang.String com.hbsc.domain.common.BaseBo.userName

 

Field[] getFieldsWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls)

獲取字段上有指定註解的字段(公共、私有、靜態等),並返回一個字段數組

List<Field> getFieldsListWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls)

獲取字段上有指定註解的字段(公共、私有、靜態等),並返回一個字段集合

List<Field> fieldsListWithAnnotation = FieldUtils.getFieldsListWithAnnotation(
    QcTemplate.class, JsonIgnore.class);
fieldsListWithAnnotation.forEach(System.out::println);

Field[] fieldsWithAnnotation = FieldUtils.getFieldsWithAnnotation(QcTemplate.class,
    JsonIgnore.class);
Arrays.stream(fieldsWithAnnotation).forEach(System.out::println);


Object readStaticField(Field field) 讀取公共靜態屬性的值,包括繼承/實現的公共的字段

Object readStaticField(Field field, boolean forceAccess)

讀取靜態屬性的值,包括繼承/實現的靜態字段,與上面的區別是可以讀到私有的

Object readStaticField(Class<?> cls, String fieldName) 讀取靜態屬性的值,包括繼承/實現的公共的字段

Object readStaticField(Class<?> cls, String fieldName, boolean forceAccess)

讀取靜態屬性的值,與上面的區別是可以讀到私有的

 

Object readDeclaredStaticField(Class<?> cls, String fieldName)

讀取公共靜態屬性的值,不包括繼承/實現的公共的字段

Object readDeclaredStaticField(Class<?> cls, String fieldName, boolean forceAccess)

讀取靜態屬性的值,不包括繼承/實現的靜態字段,與上面的區別是可以讀到私有的

 

Object readField(Field field, Object target) 讀取對象的指定字段(公共的),包括可以讀到繼承/實現的字段

Object readField(Field field, Object target, boolean forceAccess)

讀取對象的指定字段(都可以讀到),包括可以讀到繼承/實現的字段

QcTemplate qcTemplate = new QcTemplate();
qcTemplate.setPage(123L);

Field pageField = FieldUtils.getField(QcTemplate.class, "page", true);
Object page = FieldUtils.readField(pageField, qcTemplate, true);
System.out.println(page); // 123



Object readField(Object target, String fieldName) 讀取對象的指定字段名(公共的),包括可以讀到父類的

Object readField(Object target, String fieldName, boolean forceAccess)

讀取對象的指定字段名(都可以讀到),包括可以讀到父類的

QcTemplate qcTemplate = new QcTemplate();
qcTemplate.setOrgId("123");

Object orgId = FieldUtils.readField(qcTemplate, "orgId", true);
System.out.println(orgId); // 123

 

Object readDeclaredField(Object target, String fieldName) 讀取對象的指定字段(公共的),不可以讀到父類的

Object readDeclaredField(Object target, String fieldName, boolean forceAccess)

讀取對象的指定字段(都可以讀到),不可以讀到父類的

 

寫入的方法參數跟上面都一致,看上面過後下面的用法都應該百分百的懂

void writeStaticField(Field field, Object value)
void writeStaticField(Field field, Object value, boolean forceAccess)


void writeStaticField(Class<?> cls, String fieldName, Object value)
void writeStaticField(Class<?> cls, String fieldName, Object value, boolean forceAccess)


void writeDeclaredStaticField(Class<?> cls, String fieldName, Object value)
void writeDeclaredStaticField(Class<?> cls, String fieldName, Object value, boolean forceAccess)

 

void writeField(Field field, Object target, Object value)
void writeField(Field field, Object target, Object value, boolean forceAccess)


void writeField(Object target, String fieldName, Object value)
void writeField(Object target, String fieldName, Object value, boolean forceAccess)


void removeFinalModifier(final Field field) //刪除字段的final修飾
void removeFinalModifier(final Field field, final boolean forceAccess)
不推薦使用。 
從Java 12.0開始,我們不再可以刪除final修飾符,從而使此方法過時了。有關此更改的JDK討論可以在這裏找到:http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-November/056486.html
void writeDeclaredField(Object target, String fieldName, Object value)
void writeDeclaredField(Object target, String fieldName, Object value, boolean forceAccess)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章