読者です 読者をやめる 読者になる 読者になる

動的にClassオブジェクトを取得する際の落とし穴

ActionScript Flex

AS3にもJavaでいうところのClass.forName(クラス名)で動的にクラスを取得する方法が存在します。getDefinitionByName関数に文字列でクラスのfqdnを指定することで同様のことが可能です。しかし、AS3ではJavaのように一筋縄ではいかないのです。
Javaではパスの通っているclassファイルやJarファイルに対象のクラスが含まれていればClass.forNameでロードすることができますが、AS3ではどこかに対象のクラスを1箇所で良いので定義(import)しておく必要があるのです。どこのソースでも定義されていないクラスはgetDefinitionByNameでも取得できないということです。ASやFlexのコア実装をするには必ず頭に入れておかなくてはならないでしょう。

flexであれば、この問題の回避法はもう1つ存在します。flex-config.xmlに動的ロードしたいクラスを列挙すれば、どこかのソースコードに最低1箇所定義せずにgetDefinitionByNameが可能になります。includes配下にsymbolでクラスのfqdnを指定します。



org.stormcat.test.Hoge1
org.stormcat.test.Hoge2

flex-config.xmlの設定を適用するにはコンパイルオプションに以下を追加します。作成したflex-config.xmlの設定をデフォルトのflex-config.xmlの設定に追加するようにした方がよいので、"+="でファイル名を指定します(ファイル名はflex-config.xmlでなくてもOKです)。


-load-config+=flex-config.xml