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


参考サイト