2

抽象オブジェクトAへの参照があります。このオブジェクトは、いつでもオブジェクトBC、またはDのインスタンスでもあります。

拡張クラスに関係なく、A内の特定の型のプライベート finalフィールドへの参照が必要です。

フィールドの名前はわかりませんが、抽象クラスの他のすべてのフィールドに固有のタイプだけです。リストされている 4 つのクラスのコードを変更できません。getDeclaredFields() を使用すると、その時点で持っている拡張クラス内のフィールドが返されます。

このフィールドへの参照を取得するにはどうすればよいですか?

4

3 に答える 3

2

クラス自体に直接アクセスできない場合は、次のようにできます-

Field[] fields = obj.getClass().getSuperclass().getDeclaredFields();
for(Field field : fields) {
    if(field.getType() == String.class) { //assume the type is String

    }
}

しかし、クラスにアクセスできる場合は、

Field[] fields = B.class.getSuperclass().getDeclaredFields();

あるいは

Field[] fields = A.class.getDeclaredFields();
于 2013-06-20T05:13:08.030 に答える
2
import java.lang.reflect.Field;

abstract class A {
    private final String secret = "got it";
}

class B extends A {
    private final String secret = "try again";
}

public class Test {

    public static void main(String[] args) throws IllegalAccessException {
        Class neededType = String.class;
        A a = new B();
        Class c = a.getClass();
        Class sc = c.getSuperclass();
        Field flds[] =  sc.getDeclaredFields();
        for (Field f : flds) {
            if (neededType.equals(f.getType())) {
                f.setAccessible(true);
                System.out.println(f.get(a));
            }
        }
    }

}
于 2013-06-20T05:13:55.483 に答える