Ceylonでのクラス情報を取得などをやってみます。
Javaで言うとリフレクションなどですね。
以前の回で作ったカウンタークラスを参照してみます。
class Counter(variable Integer i) {
shared Integer add() {
return i++;
}
shared Integer nowCount {
return i;
}
}
クラスのメタ情報を参照するときにはこんな感じ
void classRef() {
ClassDeclaration counterClass = `class Counter`;
print(counterClass);
for(m in counterClass.memberDeclarations<FunctionDeclaration>()) {
print(m);
}
}
ClassDeclarationでクラスで定義されている関数やパラメータなどを取得できます。
クラスをバッククオートで囲ってやるとClassDeclarationとして取得することが出来ます。
もちろん宣言されていないクラスなどをしていするとちゃんとコンパイルエラーになってくれます。
関数の情報のときにはこうです
FunctionDeclaration counterAddMethod = `function Counter.add`;
classがfunctionになっただけですね。
#まとめ
こんな感じでクラスのメタデータを使った処理は
フレームワークなどを作るときには使うんじゃないでしょうか。
普通の業務ロジックで使いだすと黒魔術的になってしまい
静的型付言語としての意味がなくなってしまうので
使いどころは絞って使って行きましょうー。