要件

文字列(String)からクラスのインスタンスを呼びたいというハック

留意点

  • パッケージがある場合は完全修飾名を書く必要がある
  • カスタムクラスはimportする必要がある
  • タイムラインなどで一回newするか代入するなどしてメモリにロードされてる必要がある
  • クラスメンバのストリングの扱いは要注意

基本的な書き方

var className = "Array"; //組み込みはそのままつかえる var a = new (eval( className ));

⇒いける

引数を入れる場合

var className = "Array"; //引数つき var a = new (eval( className ))("hoge","foo");

⇒いける

importが必要な場合

import flash.net.FileReference; //ストリングが不完全 var className = "FileReference"; var a = new (eval( className ));

⇒だめ

clashNameの内容を完全修飾名にする

import flash.net.FileReference; var className = "flash.net.FileReference"; var a = new (eval( className ));

⇒いける

カスタムクラス(自作)の場合

import myClass; var className = "myClass"; var a = new (eval( className ));

⇒だめ

ここがちょっとややこしいがnew以前に何かしらクラスにアクセスしてメモリ上にロードしておく必要がある

import myClass; var temp = myClass; var className = "myClass"; var a = new (eval( className ));

⇒いける

カスタムクラス(自作)パッケージ付きの場合

import jp.co.cuppy.myClass; var temp = myClass;//代入されてる var className = "jp.co.cuppy.myClass"; var a = new (eval( className ));

⇒いける

import jp.co.cuppy.myClass; new myClass;//newされてる var className = "jp.co.cuppy.myClass"; var a = new (eval( className ));

⇒いける

ただしクラスメソッドの場合は注意

シングルトンパターンのように、クラスメソッドでnewする場合は名前もクラスメンバになるので注意が必要です

var temp = myClass;//どこかで定義(ファクトリメソッド内でもOK) //------------- static var myName = "myClass"; static function getInstance() {  return new (eval(myName) ); }

⇒だめ

なぜか直接呼べないのでいったんローカル変数にコピーするとうまくいく

var temp = myClass; //------------- static var myName = "myClass"; static function getInstance() { var n = myName;//ローカルにコピーするとOK  return new (eval(myName) ); }

⇒いける

HTML5飯