「Java8」リフレクションを使用してprivateのメンバー変数を変更する

2022年1月12日

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

Java

Posted by arkgame