Javareflection得到所有私人领域

我不知道是否有一种方法来获得所有类的java私有领域和他们的types。

例如让我们假设我有一个类

class SomeClass { private String aaa; private SomeOtherClass bbb; private double ccc; } 

现在我想获得类SomeClass所有私有字段( aaabbbccc )(不知道所有字段的名称),并检查它们的types。

可以使用Class getDeclaredFields()方法获取所有字段。 那么你必须检查每个字段的修饰符来find私人的字段:

 List<Field> privateFields = new ArrayList<>(); Field[] allFields = SomeClass.class.getDeclaredFields(); for (Field field : allFields) { if (Modifier.isPrivate(field.getModifiers())) { privateFields.add(field); } } 

请注意, getDeclaredFields()将不会返回inheritance的字段。

最终,您将通过Field.getType()方法获取字段的types。

您可以使用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; } } 

你的意思是吗?

 Field[] fields = SomeClass.class.getDeclaredFields(); 

从apache commons-lang3尝试FieldUtils:

 FieldUtils.getAllFieldsList(Class<?> cls) 

检查一个字段是否是私人的

你可以使用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对象上,如果该字段是private ,则返回true


收集一个class的所有领域

收集所有的字段使用:

1)如果只需要类的字段,而不需要从类层次结构中获取字段,则可以简单地使用:

 Field[] fields = SomeClass.class.getDeclaredFields(); 

2)如果你不想重新发明轮子,并获得一个类层次的所有领域,你可以依靠提供FieldUtils.getAllFieldsList Apache Commons Lang版本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)); } } 

使用Java 8:

 Field[] fields = String.class.getDeclaredFields(); List<Field> privateFieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPrivate(field.getModifiers())).collect( Collectors.toList());