プログラマメモ2 - programmer no memo2

[java]privateフィールドにアクセスする方法 2006/08/27
2006/11/26

作成されたクラスのプライベートなフィールド変数にアクセスするための方法についてです。

java.lang.reflectパッケージのFiledクラスを使用します。
Fieldクラスは、AccessibleObjectクラスのサブクラスです。AccessibleObjectクラスには、public void setAccessible(boolean flag)throws SecurityExceptionというメソッドがあります。

リフレクトされたオブジェクトのjava言語アクセスチェックを行うかどうか設定できます。

任意のオブジェクトからリフレクトされたフィールドを取得する際に使用する命令は、java.lang.Classのpublic Field getField(String name)throws NoSuchFieldException,SecurityExceptionメソッドではなく
public Field[] getDeclaredFields()throws SecurityExceptionを使用します。

getFiledメソッドは、publicなフィールドを返しますので、使用する時点でフィールドにはアクセスできません。

privateフィールドにアクセスするサンプルコードです。

import java.lang.reflect.Field;

public class TestA {

/**
*
* @param args
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {

Aaa aaa = new Aaa();
// (1)アクセスできます
Field field = aaa.getClass().getDeclaredField("str");
field.setAccessible(true);
System.out.println(field.get(aaa));

// (2)アクセスできません
Field field2 = aaa.getClass().getField("str");
field2.setAccessible(true);
System.out.println(field2.get(aaa));

}

}

/*
* private なフィールドをもつクラス
*/
class Aaa {
private String str = "iamPrivateField";
}




Accessing nonpublic members
「Java Reflection in Action (In Action)」P.38



: