Java:リフレクションの使い方
Javaのリフレクションは、実行時に、文字列(変数名や関数名)を通して、変数の読み書きや関数の呼び出しを行うための機能です。
arithmetics.java
class Arithmetics {
public String attribute;
public double add(double x, double y) {
return x + y;
}
}
main.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Main {
public static void main(String... args) {
try {
String stringClass = "Arithmetics";
String stringField = "attribute";
String stringMethod = "add";
Class<?> clazz = Class.forName(stringClass);
Object object = clazz.newInstance();
Field field = clazz.getField(stringField);
field.set(object, "Hello!");
System.out.println(field.get(object));
Method method = clazz.getMethod(stringMethod, double.class, double.class);
System.out.println(method.invoke(object, 1, 1));
}
catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
〈実行結果〉
Hello! 2.0
Javaのリフレクションを使うとアノテーション情報を取得することもできます。
InfoAnnotation.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
public @interface InfoAnnotation {
String info() default "";
}
arithmetics.java
class Arithmetics {
@InfoAnnotation(info = "field")
public String attribute;
@InfoAnnotation(info = "method")
public double add(double x, double y) {
return x + y;
}
}
main.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Main {
public static void main(String... args) {
try {
Field field = Arithmetics.class.getField("attribute");
InfoAnnotation fieldAnnotation = field.getAnnotation(InfoAnnotation.class);
System.out.println(fieldAnnotation.info());
Method method = Arithmetics.class.getMethod("add", double.class, double.class);
InfoAnnotation methodAnnotation = method.getAnnotation(InfoAnnotation.class);
System.out.println(methodAnnotation.info());
}
catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
〈実行結果〉
field method
参考サイト
- Google:Java リフレクション
- 【Java入門】リフレクションでメソッドの実行、フィールドの変更
- リフレクションとは?
- Java 独自のアノテーションを作成して値を取得するサンプル
- アノテーションとリフレクションで共通処理を実現する
- JavaのリフレクションAPIでアノテーション取得
- Javaのリフレクションとアノテーションについて