通过 Java 中的反射访问私有继承字段

我找到了一种方法,通过获得继承成员,并通过访问私人成员,但我正在寻找私人继承字段。我怎样才能做到这一点?class.getDeclaredFields();class.getFields()


答案 1

这应该演示如何解决它:

import java.lang.reflect.Field;

class Super {
    private int i = 5;
}

public class B extends Super {
    public static void main(String[] args) throws Exception {
        B b = new B();
        Field f = b.getClass().getSuperclass().getDeclaredField("i");
        f.setAccessible(true);
        System.out.println(f.get(b));
    }
}

(或 Class.get 声明字段,用于所有字段的数组。

输出:

5

答案 2

这里最好的方法是使用访问者模式来查找类中的所有字段和所有超类,并对它们执行回调操作。


实现

Spring有一个很好的Utility类ReflectUtils,它就是这样做的:它定义了一个方法,用一个回调来遍历所有超类的所有字段:ReflectionUtils.doWithFields()

文档:

在目标类中的所有字段上调用给定的回调,在类层次结构中向上移动以获取所有声明的字段。

参数:
- clazz - 要分析
的目标类 - fc - 要为每个字段
调用的回调 - ff - 确定要应用回调的字段的筛选器

示例代码:

ReflectionUtils.doWithFields(RoleUnresolvedList.class,
    new FieldCallback(){

        @Override
        public void doWith(final Field field) throws IllegalArgumentException,
            IllegalAccessException{

            System.out.println("Found field " + field + " in type "
                + field.getDeclaringClass());

        }
    },
    new FieldFilter(){

        @Override
        public boolean matches(final Field field){
            final int modifiers = field.getModifiers();
            // no static fields please
            return !Modifier.isStatic(modifiers);
        }
    });

输出:

找到字段私有瞬态布尔 javax.management.relation.RoleUnresolvedList.typeSafe in type class javax.management.relation.RoleUnresolvedList
Found field private transient boolean javax.management.relation.RoleUnresolvedList.tainted in type class javax.management.relation.RoleUnresolvedList.RoleUnresolvedList
找到的字段 private transient java.lang.Object[] java.util.ArrayList.elementData in type class java.util.ArrayList
在类型类 java.util.ArrayList 中找到字段 private int java.util.ArrayList 找到字段 private int java.util.ArrayList.size
在类型类 java.util.AbstractList 中找到字段受保护的瞬态 int java.util.AbstractList


推荐