クラス名の文字列を渡してそのクラス名のインスタンスを作る方法

昨日の記事の結果です。


flash.utils.getDefinitionByNameでできるようです。
http://livedocs.adobe.com/flex/201_jp/langref/flash/utils/package.html#getDefinitionByName()
簡単な例です。

package
{
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;
    
    public class Test extends Sprite
    {
        test.ExClass;
        
        var cls:Class = getDefinitionByName("test.ExClass") as Class;
        new cls();    // インスタンス化
    }
}

getDefinitionByNameに渡す文字列は、パッケージ内にあるならパッケージも書かなければならないようです。
途中の「test.ExClass;」というのは、コンパイル時にtest.ExClassをswfファイルに埋め込むために必要です。もし「test.ExClass;」を書かないと、クラスを文字列「"test.ExClass"」で渡しているだけなので、コンパイラがtest.ExClassを不要もしくは必要だと気づかないので、swfに埋め込まないとのこと。詳しくは昨日にも出てきた以下のリンク先へ。
クラスへのアクセスに配列アクセス演算子は使えない?


今回調べている途中に分かった新たな構文がありました。
X-LABO: AS3 パッケージ記述簡略化

var cls:Class = test.First;
new cls();
http://www.dango-itimi.com/blog/archives/2007/000930.html

クラスを変数に渡しておくことができるようです。事前に必要なクラスを変数に設定しておき、状況に応じて後からインスタンス化できます。これまでまったく知りませんでした。
そういえばリソースの埋め込みの際の処理に似たことをしていたような。これで意味が具体的に分かりました。