Java反射获取所有私有字段

Java反射获取所有私有字段,java,reflection,field,private,Java,Reflection,Field,Private,我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型 例如,让我们假设我有一个类 class SomeClass { private String aaa; private SomeOtherClass bbb; private double ccc; } 现在我想获取类SomeClass的所有私有字段(aaa,bbb,ccc),并检查它们的类型。你的意思是喜欢吗 Field[] fields = SomeClass.class.getDeclaredF

我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型

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

class SomeClass {
    private String aaa;
    private SomeOtherClass bbb;
    private double ccc;
}
现在我想获取类
SomeClass
的所有私有字段(
aaa
bbb
ccc
),并检查它们的类型。

你的意思是喜欢吗

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

可以使用
类的
getDeclaredFields()
方法获取所有字段。然后,您必须检查每个字段的修饰符以查找专用字段:

List<Field> privateFields = new ArrayList<>();
Field[] allFields = SomeClass.class.getDeclaredFields();
for (Field field : allFields) {
    if (Modifier.isPrivate(field.getModifiers())) {
        privateFields.add(field);
    }
}
List privateFields=new ArrayList();
Field[]allFields=SomeClass.class.getDeclaredFields();
用于(字段:所有字段){
if(Modifier.isPrivate(field.getModifiers())){
privateFields.add(字段);
}
}
请注意,
getDeclaredFields()
将不会返回继承的字段


最后,您可以使用该方法获得字段的类型。

您可以使用
修饰符来确定字段是否为私有字段。确保使用
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;
    }
}
公共类SomeClass{
私有字符串aaa;
私人日期;
私人双ccc;
公营而非私营;
公共静态void main(字符串[]args){
列表字段=getPrivateFields(SomeClass.class);
用于(字段:字段){
System.out.println(field.getName());
}
}
公共静态列表getPrivateFields(类){
List privateFields=new ArrayList();
Field[]fields=class.getDeclaredFields();
用于(字段:字段){
if(Modifier.isPrivate(field.getModifiers())){
privateFields.add(字段);
}
}
归还私人土地;
}
}
尝试使用apache commons-lang3:

FieldUtils.getAllFieldsList(Class<?> cls)
FieldUtils.getAllFieldsList(类cls)
检查字段是否为私有字段 您可以使用以下方法过滤字段:

在单个
字段
对象上,如果字段为
私有


收集类的所有字段 要收集所有字段的数据,请使用:

1) 若您只需要类的字段,而不需要从类层次结构中获取的字段,则只需使用:

Field[] fields = SomeClass.class.getDeclaredFields();
2) 如果您不想重新发明轮子并获得类层次结构的所有字段,您可以依赖版本3.2+,该版本提供:

import java.lang.reflect.Field;
导入java.util.AbstractCollection;
导入java.util.AbstractList;
导入java.util.AbstractSequentialList;
导入java.util.array;
导入java.util.LinkedList;
导入java.util.List;
导入org.apache.commons.lang3.reflect.FieldUtils;
导入org.junit.Assert;
导入org.junit.Test;
公共类字段测试{
@试验
public void testGetAllFieldsList(){
//获取该类及其所有父类中的所有字段
最终列表allFields=FieldUtils.getAllFieldsList(LinkedList.class);
//获取类型层次结构中每个单独类的字段
最终列表allFieldsClass=Arrays.asList(LinkedList.class.getFields());
最终列表allFieldsParent=Arrays.asList(AbstractSequentialList.class.getFields());
最终列表allFieldsParentsParent=Arrays.asList(AbstractList.class.getFields());
最终列表allfieldsparentsparent=Arrays.asList(AbstractCollection.class.getFields());
//测试“getAllFieldsList”确实获得了类及其所有父类的所有字段
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());
Field[]fields=String.class.getDeclaredFields();
List privateFieldList=Arrays.asList(fields.stream().filter(field->Modifier.isPrivate(field.getModifiers()).collect(
收藏家;

@AfzaalAhmadZeeshan当我们显然需要使用变量“clazz”而不是关键字“class”时,为什么您要将我的编辑“clazz”更改为“class”?很抱歉,我认为这是一个错误,因为文档或代码中没有任何变量!请原谅。@AfzaalAhmadZeeshan有一个变量,它在方法的参数中。不过,既然我不能更改,你愿意撤销你的更改吗?@atk没有人强迫你回答;但对于我们中的许多人来说,从谷歌那里得到的这个问题,最重要的答案是一个比阅读关于反思的长文章更简洁的解释。即使是像这样的长尾问题也有助于今天的情况。请看,这排除了任何继承的字段。我认为,我正在处理一个已编译的类,这一事实使它非常不方便,因为返回的字段具有诸如
m0
m1
等名称,并且类型为
java.lang.reflect.Method
。这可能是因为我试图在浇铸到接口的Springbean上使用反射?
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));
    }
}
Field[] fields = String.class.getDeclaredFields();
List<Field> privateFieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPrivate(field.getModifiers())).collect(
        Collectors.toList());