Javaによるリフレクションを利用してプロパティに値を設定する方法は?
リフレクションを通してプロパティに値を割り当てるには、次の手順を実行します。
- Class.forName()
- 自然に日本語に近い表現にしました。
- フィールドを取得する
- getDeclaredField()
- getField()
- getDeclaredField() をネイティブに日本語で言い換えてください。1 つのオプションのみ必要です。
- setAccessible(true)だけでネイティブの日本語に言い換えることができます。
- set()
簡単な例を以下に示します。
class Person {
public String name;
private int age;
public void setName(String name) {
this.name = name;
}
private void setAge(int age) {
this.age = age;
}
}
public class Main {
public static void main(String[] args) throws Exception {
// 获取Person类的Class对象
Class<?> personClass = Class.forName("Person");
// 获取name属性对象
java.lang.reflect.Field nameField = personClass.getField("name");
// 创建Person对象
Person person = new Person();
// 给name属性赋值
nameField.set(person, "John");
// 获取age属性对象
java.lang.reflect.Field ageField = personClass.getDeclaredField("age");
// 设置age属性可访问性为true
ageField.setAccessible(true);
// 给age属性赋值
ageField.set(person, 20);
System.out.println(person.name); // 输出: John
System.out.println(ageField.getInt(person)); // 输出: 20
}
}
上記の例では、まずClass.forName()メソッドでPersonクラスのClassオブジェクトを取得しています。その後getField()メソッドでname属性オブジェクトを取得し、値を設定しています。続いてgetDeclaredField()メソッドでage属性オブジェクトを取得し、setAccessible(true)メソッドでアクセス性をtrueに設定しないとage属性に値を設定できません。最後に、name属性およびageField.getInt()メソッドで属性の値を取得しています。