我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型。
例如,假设我有一堂课
class SomeClass {
private String aaa;
private SomeOtherClass bbb;
private double ccc;
}
现在,我想获得的所有私有字段(aaa
,bbb
,ccc
类)SomeClass
(如果不知道所有领域前期的名称),并检查它们的类型。
我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型。
例如,假设我有一堂课
class SomeClass {
private String aaa;
private SomeOtherClass bbb;
private double ccc;
}
现在,我想获得的所有私有字段(aaa
,bbb
,ccc
类)SomeClass
(如果不知道所有领域前期的名称),并检查它们的类型。
Answers:
有可能获得与方法的所有字段getDeclaredFields()
的Class
。然后,您必须检查每个字段的修饰符以查找私有字段:
List<Field> privateFields = new ArrayList<>();
Field[] allFields = SomeClass.class.getDeclaredFields();
for (Field field : allFields) {
if (Modifier.isPrivate(field.getModifiers())) {
privateFields.add(field);
}
}
请注意,getDeclaredFields()
这不会返回继承的字段。
最终,您可以使用Field.getType()方法获得字段的类型。
您可以Modifier
用来确定字段是否为私有。确保使用该getDeclaredFields
方法来确保您从类中检索私有字段,调用getFields
只会返回公共字段。
public class SomeClass {
private String aaa;
private Date date;
private double ccc;
public int notPrivate;
public static void main(String[] args) {
List<Field> fields = getPrivateFields(SomeClass.class);
for(Field field: fields){
System.out.println(field.getName());
}
}
public static List<Field> getPrivateFields(Class<?> theClass){
List<Field> privateFields = new ArrayList<Field>();
Field[] fields = theClass.getDeclaredFields();
for(Field field:fields){
if(Modifier.isPrivate(field.getModifiers())){
privateFields.add(field);
}
}
return privateFields;
}
}
FieldUtils
从apache commons-lang3尝试:
FieldUtils.getAllFieldsList(Class<?> cls)
使用Java 8:
Field[] fields = String.class.getDeclaredFields();
List<Field> privateFieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPrivate(field.getModifiers())).collect(
Collectors.toList());
您可以使用Modifier.isPrivate过滤字段:
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
// ...
Field field = null;
// retrieve the field in some way
// ...
Modifier.isPrivate(field.getModifiers())
在单个Field
对象上,true
如果该字段是private
要收集所有字段,请使用:
1)如果只需要类的字段,而无需从类层次结构中获取字段,则可以简单地使用:
Field[] fields = SomeClass.class.getDeclaredFields();
2)如果您不想重新发明轮子并获得类层次结构的所有字段,则可以依赖Apache Commons Lang 3.2+版本,该版本提供FieldUtils.getAllFieldsList
:
import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;
public class FieldUtilsTest {
@Test
public void testGetAllFieldsList() {
// Get all fields in this class and all of its parents
final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);
// Get the fields form each individual class in the type's hierarchy
final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());
// Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents
Assert.assertTrue(allFields.containsAll(allFieldsClass));
Assert.assertTrue(allFields.containsAll(allFieldsParent));
Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
}
}