「Java8」リフレクションを使用してprivateのメンバー変数を変更する
環境
Windows 10 64bit
Eclipse 2019
Java8
書式
クラス名 インスタンス変数名 = new クラス名();
Class<?> オブジェクト名 = インスタンス変数名.getClass();
Field 変数A = オブジェクト名.getDeclaredField(メンバー変数名);
変数A.setAccessible(true);
リフレクションを使用してクラスのprivateのメンバー変数はクラスの外部から変更できます
使用例
package com.arkgame.testinfo;
import java.lang.reflect.Field;
public class TestUser {
public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException,
NoSuchFieldException, IllegalAccessException {
Employee emp = new Employee();
//Classクラスのインスタンスを取得
Class<?> cft = emp.getClass();
Field fd;
//メンバー変数を取得
fd = cft.getDeclaredField("username");
//privateのメンバー変数のアクセス可能になる
fd.setAccessible(true);
System.out.println("privateの変数usernameに値をセットします");
fd.set(emp, "山田太郎");
//メソッドを呼び出す
System.out.println(emp.getUserName());
}
}
//クラスUserの定義
class Employee {
//privateのメンバー変数
private String username;
//メソッド
public String getUserName() {
return username;
}
}
実行結果
privateの変数usernameに値をセットします
山田太郎