ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   ActionScript 3.0
     flash.utils.getDefinitionByNameについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
hiroaki
投稿日時: 2007-9-24 18:48
やや 常連さん
登録日: 2007-3-22
居住地: 東京都港区
投稿: 28
flash.utils.getDefinitionByNameについて
皆様.お世話になります.

flash.utils.getDefinisionByNameの動作(仕様)についてお尋ねしたいと思います.

まず,Flexプロジェクトを作成し,下記のクラスを作成します.

package test.main
{
  public class Hello
  {
    public function hello():void {
      trace("hello");
    }
  }
}


そして,メインのmxmlにて,下記スクリプトを実行するとうまく動作します.

var clazz:Class = flash.utils.getDefinitionByName("test.main.Hello") as Class;
var instance:Object = new clazz();
instance.hello();



次に,Flexライブラリプロジェクトを作成し,mx.core.Applicationを継承した独自アプリケーションタグ(MyApplication)を定義します.
MyApplicationは,FlexEvent.CREATION_COMPLETEイベントを受け取ると,このライブラリプロジェクトを使用して作成するFlexプロジェクトの
あるオブジェクトをnewするとします.ここでは説明を簡単にするため,常にtest.main.Helloクラスをnewすると仮定します.

具体的には次のように記述します.

// パッケージインポート
	public class MyApplication extends Application
	{
		
		public function MyApplication() {
			this.addEventListener(FlexEvent.CREATION_COMPLETE,initHandler,true,int.MAX_VALUE,false);
		}
		
		private function initHandler(event:FlexEvent):void {
			var clazz:Class = flash.utils.getDefinitionByName("test.main.Hello") as Class;
			var instance:Object = new clazz();
		}
	}


そして,このライブラリプロジェクトをLibrary Pathに加え,test.main.Hello.asというクラスを作成し,次のmxmlを
実行します.


<?xml version="1.0" encoding="utf-8"?>
<my:MyApplication
	xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:cm="http://my.domain/mxml"
	layout="absolute"
	creationComplete="init();">
	
	<mx:Script>
		<![CDATA[
			private function init():void {
			}
			
		]]>
	</mx:Script>
</my:MyApplication>


すると,"var clazz:Class = flash.utils.getDefinitionByName("test.main.Hello") as Class;"の部分で
「ReferenceError: Error #1065: 変数 Hello は定義されていません。」
というエラーが出ます.

そこで,今度はcreationCompleteイベントで実行されるinit関数にHelloクラスの変数を定義します(newはしません)

<?xml version="1.0" encoding="utf-8"?>
<my:MyApplication
	xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:cm="http://my.domain/mxml"
	layout="absolute"
	creationComplete="init();">
	
	<mx:Script>
		<![CDATA[
			private function init():void {
				var hello:Hello;
			}
			
		]]>
	</mx:Script>
</my:MyApplication>


すると,今度はエラーは起きません.

そこで,質問なのですが,この現象から考えると,ライブラリプロジェクトをLibProj,それを使用するプロジェクトを
UseProjとした場合,LibProjの中でUseProjに定義されたクラスをgetDefinitionByNameでインスタンス化するときには,
UseProjの中で必ず変数定義をしておかなければならないのでしょうか?

やりたいことは,オブジェクトの生成後に名前ベースのルールを作って,動的にオブジェクトを生成するライブラリを
作成したいと思っています.上記のように変数を定義すればできるのですが,極力避けたいと思っています.
なんとなく,定義しておかなければ参照が取得できないのでダメなような気もするのですが..Javaであれば
バイトコードがあれば強引にファイル読み込みでできるんですけどね..

ご助言よろしくお願いします.
Pepe
投稿日時: 2007-9-26 17:56
モデレータ
登録日: 2006-1-10
居住地:
投稿: 1274
Re: flash.utils.getDefinitionByNameについて
「getDefinitionByName」はクラス情報がコンパイルされた
SWFに存在しないとエラーになります。
また、Flex2ではコンパイルの最適化機能があり
使用されていないクラスはSWF内に取り込まれましぇん (^o^)丿

従って、
 ・ダミー変数を使用してクラス情報をSWFに書き込む
 ・コンパイルオプション「-includes」を使用して
  指定したクラス情報をSWFに書き込む
 ・コンパイルオプション「-include-libraries」を
  使用してSWCライブラリ内のすべてのクラス情報を
  SWFに書き込む

のどれかの方法を適用する必要があります ^_^;


ちなみに「Module」という仕組みもあります (^o^)丿


----------------

hiroaki
投稿日時: 2007-9-27 9:36
やや 常連さん
登録日: 2007-3-22
居住地: 東京都港区
投稿: 28
Re: flash.utils.getDefinitionByNameについて
>Pepeさん

ご回答ありがとうございます.

引用:

getDefinitionByName」はクラス情報がコンパイルされた
SWFに存在しないとエラーになります。


やはりそうでしたか.論理的に考えても,ライブラリがコンパイルされた時点で知りえなかったクラスをロードすることはできないのでは?と思っていましたが,もしかしたらFlashプラグインの力でできるのか?とも思っていました.


引用:


・ダミー変数を使用してクラス情報をSWFに書き込む
 ・コンパイルオプション「-includes」を使用して
  指定したクラス情報をSWFに書き込む
 ・コンパイルオプション「-include-libraries」を
  使用してSWCライブラリ内のすべてのクラス情報を
  SWFに書き込む


またこれらの方法ですが,いずれもライブラリプロジェクトに対して行う必要があるということですよね?だとすると,ライブラリ作成時に知りえないクラスを,ライブラリの中からインスタンス化するということはできない,ということですよね?

Javaのクラスローダのように,クラスをロードする直前にフックをかけられるとよいのですが...
dsh
投稿日時: 2007-10-1 18:54
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: flash.utils.getDefinitionByNameについて
はじめまして。

引用:

やりたいことは,オブジェクトの生成後に名前ベースのルールを作って,動的にオブジェクトを生成するライブラリを
作成したいと思っています.上記のように変数を定義すればできるのですが,極力避けたいと思っています.

変数を定義しなくてもできます。
詳しくはLa-valseさんのblogエントリをご参照ください。
http://blog.so-net.ne.jp/yoshimoto/2006-12-24

※最後の方の【追記:その2やっと解決】周辺の部分が参考になると思います
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を