ActionScriptでnewInstance()

describeTypeを作ったやつは酔っていたと思う7の理由にも書いてありますが、ActionScript3.0のリフレクションはいまひとつ痒いところに手が届かない感じです。flash.utils.describeTypeという組み込み関数があり、それを使うとXML形式でクラスの情報が取れますが、どうにも・・・
単純なところで言うと、JavaでいうClassクラスはあるのですが、インスタンスを作るメソッドがない、というような感じです。

ではダイナミックにインスタンスを作る場合、AS3の場合どうするかというと、次のようなコードになります。

 import flash.utils.getDefinitionByName;

 //インスタンスを作るメソッド
 public static function newInstance(fqcn:String):Object{
  var forName:Class = getDefinitionByName(fqcn) as Class;
  var instance:Object = new forName();
  return instance;
 }

「getDefinitionByName」というのはAS3組み込みの関数で、クラス名からClassクラスを作ります。
キモは「new forName()」のところで、Javaラーから見ると非常に不可解なやり方ですね。
Class.forName().newInstace()に比べると、あんまり直感的ではないですよね。
ちなみに、この「var オブジェクト = new クラス();」みたいなやり方は、組み込みのバイト配列から画像クラスを作ったりするときも使うようで、わりと必須テクっぽいです。

 //Embedで画像組み込み
 [Embed(source="testicon.gif")]
 public const test_icon:Class;
 //Bitmapのインスタンス化
 public function createIcon():Bitmap{
  var icon:Bitmap = new test_icon();
  return icon;
 }
}


ちなみに、AS2.0の場合は次のような感じです。
元ネタはgskinnerのblogです。
evalで出来そうなところですがそれはうまく行かないようで、_globalにASファイルが変数として展開されている
ので、パッケージを順繰りしてインスタンス化するというのがミソみたいです。

もう使わないでしょうけど、AS1.0の場合は

 var obj = new [クラス名]();

でOKです。