【自分用】privateフィールドの書き換え・参照

privateなフィールドを書き換えたり取得したりする方法。
単体テストで使う用。

Java SE 1.8
Eclipse4.4
JUnit4

privateフィールドへの代入

テスト対象のクラス

package privateField;

public class privateField_1 {

    public privateField_1(){
        System.out.println("コンストラクタ");
    }

    private String _value_1="test";

    //setter
    public void setValue_1(String value){
        this._value_1=value;
    }

    //getter
    public String getValue_1(){
        return this._value_1;
    }
}

テストコード

package privateField;

import java.lang.reflect.Field;

import org.junit.Test;

public class privateField_1_Test {

    @Test
    public void checkField() {
        privateField_1 targetClass=new privateField_1();
        try{
            Field reflectedField=(Field) reflectPrivateField(targetClass,"_value_1");
            System.out.println("result:"+reflectedField.get(targetClass));
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }
    }

    @Test
    public void checkSetMethod() {
        privateField_1 targetClass=new privateField_1();
        targetClass.setValue_1("checkSetMethod");
        try{
            System.out.println("result:"+(String)getPrivateField(targetClass,"_value_1"));
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }
    }

    @Test
    public void checkGetMethod() {
        privateField_1 targetClass=new privateField_1();
        try{
            setPrivateField(targetClass, "_value_1", "checkGetMethod");
            System.out.println("result:"+targetClass.getValue_1());
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }

    }

    //privateなフィールドを参照する
    private Object reflectPrivateField(Object targetClass,String fieldName)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        return targetField;
    }

    //privateなフィールドの値を取得する
    private Object getPrivateField(Object targetClass,String fieldName)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        return targetField.get(targetClass);
    }

    //privateなフィールドに値を書き換える
    private void setPrivateField(Object targetClass,String fieldName,Object value)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        targetField.set(targetClass, value);
    }
}

実行結果

コンストラクタ
result:checkSetMethod
コンストラクタ
result:checkGetMethod
コンストラクタ
result:test

備忘録として残してます。