ブログ:Flex/AS3でクラス定義を探索する

RIA CowboyことJames Ward氏のブログで見つけた素晴らしいFlex/AS3ライブラリについて。(このエントリは、「Query the Loaded Classes in Flex / AS3 – James Ward」の内容紹介です。




まずは引用元をご覧下さい。ActionScript3でロードされているクラスの一覧を取得し、その中から任意のインターフェイスおよびメタデータタグ(Javaで言うアノテーション)が付いたクラスを抽出するサンプルが紹介されています。


ロードされているクラス定義一覧を取得して、特定のインターフェイスメタデータタグを持つクラスを抽出しているコードを引用します*1

    var a:Array = getDefinitionNames(systemManager.loaderInfo);
 
    allClasses.dataProvider = a;
 
    ifooClasses.dataProvider = new ArrayCollection();
    metafooClasses.dataProvider = new ArrayCollection();
 
    for each (var cn:String in a)
    {
      var t:Type = Type.forName(cn);
 
      if (t.hasMetaData("MetaFoo"))
      {
        metafooClasses.dataProvider.addItem(cn);
      }
 
      if (ClassUtils.isImplementationOf(t.clazz, IFoo);
      {
        ifooClasses.dataProvider.addItem(cn);
      }
    }

getDefinitionNamesによりクラス名一覧が取得され、そのクラス名をType.forName()に渡すことでTypeクラスのインスタンスを生成、このTypeクラスのAPIを利用することで対象の型に関する情報を取得しているという流れです。


このコードのインポート宣言はこちら*2

    import org.as3commons.reflect.MetaData;
    import org.as3commons.reflect.ClassUtils;
    import org.as3commons.reflect.Type;
  
    import mx.collections.ArrayCollection;  
  
    import ru.etcs.utils.getDefinitionNames;


実行時に読み込むとなるとパフォーマンスがどうなるのか若干気になる所ではあります。ただ、現実的な速度が出るようであれば、Ward氏も書いている通り軽量コンテナやプラグインなど、ずいぶん色々なことができるようになりそうですね。


最後に、ここで使われているライブラリは以下の通りです:

*1:なお、これは記事の冒頭に挙げられているものではなく、コメントの中で書かれているリバイスバージョンです。

*2:バイスバージョンではMetaDataを使わずに済むようになっています。