JavaFXのリフレクションAPIを使ってみる

JavaFXJavaによく似た静的な言語仕様なのでリフレクションAPIも用意されています。しかし、Javaのクラスとは異なったJavaFXクラスであり、インスタンスの生成処理などが異なるため、まったく同じではありません。

JavaFXでリフレクションを使って特定のクラスのインスタンスを生成するサンプルは以下のようになります。

import javafx.reflect.FXLocal;
import javafx.reflect.FXContext;
import javafx.reflect.FXObjectValue;
import javafx.reflect.FXClassType;

var ctx:FXContext = FXLocal.getContext();
var cls = ctx.findClass("javafx.scene.control.TextBox");

var objValue:FXObjectValue = cls.allocate();
objValue.initVar("content", ctx.mirrorOf("OK"));
objValue.initialize();

var obj:TextBox = (objValue as FXLocal.ObjectValue).asObject() as TextBox;
println(obj);
println(obj.value);

javafx.reflect.FXContextがリフレクションAPIで最も重要なクラスでクラスのコンテキスト(メタデータ)にアクセスする為に使用します。
クラスのインスタンスの生成には、コンストラクタを呼び出すのではなく、

  1. allocateでインスタンスのビルダクラスを生成
  2. initVar等でインスタンスの初期値を設定
  3. initializeで初期化を行う

という手順を踏みます。これはJavaFXの宣言的文法を手続き的に置き換えているため、このような形式になっていると考えられるでしょう。尚、初期値を与える必要がなければ、cls.newInstance()でallocateとinitializeをまとめて行うことができます。

また、FXObjectValue はビルダクラスに相当するため、インスタンスの参照を得るにはさらにFXLocal.ObjectValueのasObjectメソッドを呼び出す必要があります。

以上、簡単ですがリフレクションAPIの紹介でした。