「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;
}
}
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;
}
}
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に値をセットします
山田太郎