1

リフレクションを使用してからprotectedメンバーにアクセスすることは可能ですか?SubclassSuperClass

private void accessFields() {
    Field[] fields = this.getClass().getDeclaredFields();
    for(Field field : fields) {
        if(Modifier.isProtected(field.getModifiers()) {
            //Will this always work? Or will get(this) throw an IllegalAccessException?
            Object value = field.get(this);
        }
    }
}

これは、 がメンバーにアクセスするのprotectedではなく、一般的なメンバー アクセスの反対の方法であることに注意してください。SubClassprotectedSuperClass

4

2 に答える 2

3

リフレクションを使用して、オブジェクトの任意のフィールド (プライベート、保護、パブリック) にアクセスできます。オブジェクトのプライベート フィールドにアクセスするクラスがそのスーパー クラスであるかサブ クラスであるかは問題ではありません (リフレクションを使用する場合)。

PrivateObject privateObject = new PrivateObject("The Private Value");

Field privateStringField = PrivateObject.class.
        getDeclaredField("privateString");

privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

クラスのオブジェクトを取得できる限り、PrivateObjectそのフィールドにアクセスできます。field.setAccessible(true)非公開フィールドにアクセスすることを忘れないでください。

于 2013-06-01T06:11:07.817 に答える