Javareflection得到所有私人领域
我不知道是否有一种方法来获得所有类的java私有领域和他们的types。
例如让我们假设我有一个类
class SomeClass { private String aaa; private SomeOtherClass bbb; private double ccc; }
现在我想获得类SomeClass
所有私有字段( aaa
, bbb
, ccc
)(不知道所有字段的名称),并检查它们的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());