java - 列出 Java 对象的所有私有(private)字段?

标签 java reflection encapsulation

类似于this question ,我需要访问一个 POJO 实例的所有私有(private)字段。不同之处在于我不知道我想要的字段的具体名称。

例如,如果我的 POJO 是:

public class Widget {
    private java.lang.String fizz;
    private java.lang.Boolean buzz;
    private com.me.myapp.Foo foo;
}

我正在寻找某种方法来检查 Widget 实例(或类本身)并查看它是否具有这 3 个字段/类型,而无需提前知道它们的名称/类型。

这可能吗?如果是这样,如何?如果不是,为什么?

更新:

System.out.println("classToInspect = " + classToInspect.getName() + ", and fields are:\n");
for(Field f : allFields)
    System.out.println(f.getType());

打印:

classToInspect = com.myorg.myapp.LoggerConfig, and fields are:

int
int
int
class java.lang.reflect.Constructor
class java.lang.Class
class java.lang.String
class java.security.ProtectionDomain
boolean
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
class java.lang.ref.SoftReference
int
int
class sun.reflect.generics.repository.ClassRepository
long
class [Ljava.io.ObjectStreamField;
class sun.reflect.ReflectionFactory
boolean
class [Ljava.lang.Object;
interface java.util.Map
class [Ljava.lang.annotation.Annotation;
interface java.util.Map
interface java.util.Map
class sun.reflect.annotation.AnnotationType

请注意:这些字段都不是我的实际 LoggerConfig 类的字段/属性/成员;它们必须通过反射或 Object 父类(super class)的一部分提供/添加...

最佳答案

您可以使用 Class 类的 getDeclaredFields 方法来获取类中声明的所有字段,而不管其修饰符如何。使用 getDeclaredFields 方法将为您提供一个 Field 数组,然后您可以对其进行迭代,并调用 getType 方法获取类型的领域。以下代码演示了相同的内容:

class TestClass
{
    private String x;
    private int y;
    private boolean z;
}
public class Test
{
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException 
    {
        Class clazz = TestClass.class;
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) 
        {
            System.out.println("fieldName: "+field.getName()+", fieldType: "+field.getType());
        }
    }
}

以上代码输出:

fieldName: x, fieldType: class java.lang.String
fieldName: y, fieldType: int
fieldName: z, fieldType: boolean

关于java - 列出 Java 对象的所有私有(private)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451506/

相关文章:

java - 无法从 Tomcat 中运行的 Guava r08 加载类。无法从源代码编译。缺少 javax.annotations

android - RemoteViews 方法名称

C#:部分类和 Web 服务:分离形式和功能

java - 二叉搜索树中的递归 toString() 方法。这个的时间复杂度是多少?

java - 从 JSNI 类创建 GWT jar

java - 对 Hazelcast 来说,在每个条目上调用 .size() 是否会造成性能问题?

c# - 比较来自 GetValue 反射方法的两个值

c# - 获取泛型类型参数的数量

java - 我的程序中有一个错误,提示错误 : class, 接口(interface),或预期的枚举。该怎么办?

javascript - 如何创建具有自定义内部插槽的对象?