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

2022年1月12日

環境
Windows 10 64bit
Eclipse 2019
Java8

書式
クラス名 インスタンス変数名 = new クラス名();
Class<?> オブジェクト名 = インスタンス変数名.getClass();
Field 変数A = オブジェクト名.getDeclaredField(メンバー変数名);
変数A.setAccessible(true);
リフレクションを使用してクラスのprivateのメンバー変数はクラスの外部から変更できます

使用例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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に値をセットします
山田太郎

Java

Posted by arkgame