文字列(String)でクラスをNewしたい
要件
文字列(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) ); }
⇒いける