単刀直入、Dart言語でJava言語のような「自作アノテーション」を作成する事は可能なのか?
→ 結論:可能
今回は「ポケモン」のネタをベースにDart言語で自作アノテーションを作成してみた。
作成するアノテーションは以下の通り、図鑑番号などが定義されているアノテーション。
■ ポケモンアノテーション(PokemonAnnotation)
- 図鑑番号:int型
- ポケモン名:String型
- 種族値:List(int)型
サンプルコード
ポケモン「チョンチー」「ランターン」の図鑑番号、名前、種族値をコンソール上に出力するサンプル。
自身のクラスをリフレクションする事で、継承クラスの対応も可能。
Main.dart
import 'dart:mirrors';
import 'PokemonAnnotation.dart';
void main() {
Chinchou().printPokemonData();
Lanturn().printPokemonData();
}
@PokemonAnnotation(170, "チョンチー", [75, 38, 38, 56, 56, 67])
class Chinchou {
void printPokemonData() {
ClassMirror classMirror = reflectClass(this.runtimeType); // 自身のクラスをリフレクション
int dexNumber = classMirror.metadata.first.reflectee.pokemonDexNumber;
String name = classMirror.metadata.first.reflectee.pokemonName;
List<int> baseStats = classMirror.metadata.first.reflectee.pokemonBaseStats;
print(dexNumber);
print(name);
print(baseStats);
}
}
@PokemonAnnotation(171, "ランターン", [125, 58, 58, 76, 76, 67])
class Lanturn extends Chinchou {
// Chinchouクラス継承
}
PokemonAnnotation.dart
library PokemonAnnotation;
class PokemonAnnotation {
final int pokemonDexNumber;
final String pokemonName;
final List<int> pokemonBaseStats;
const PokemonAnnotation(
this.pokemonDexNumber, this.pokemonName, this.pokemonBaseStats);
}
実行結果
ポケモン「チョンチー」「ランターン」の図鑑番号、名前、種族値がコンソール上に出力された。
170
チョンチー
[75, 38, 38, 56, 56, 67]
171
ランターン
[125, 58, 58, 76, 76, 67]
Exited
感想
Java言語で自作アノテーションを作成する事があったため、Dart言語でも同様に作成できるのはありがたい。
「Dart言語で自作アノテーション作成できないか?」という疑問から調べてはみたが、参考になる資料が思ってたより見つからなかったため、メモ用として本記事を残しておく。(調べ方が悪いだけかもしれないが...)