「オブジェクトイントロスペクション」は、クラスのエレメント(そのプロパティやメソッドなど)を実行時に調べる手法です。ActionScript でイントロスペクションを実行するには、次の 2 とおりの方法があります。
オブジェクトイントロスペクションが便利だと感じるのは、アプリケーションをデバッグするときです。例えば、Object 型の汎用オブジェクトをパラメータとして受け取るメソッドを記述するとします。この場合は、イントロスペクションを使用して Object のプロパティとメソッドをすべて出力し、アプリケーションから何が渡されたかを正確に把握できます。
for..in ループを使用すると、オブジェクトに対して反復処理を行い、プロパティと値を出力できます。for..in ループでは、動的に追加されたプロパティのみが列挙されます。クラスの宣言された変数とメソッドは、for..in ループでは列挙されません。これは、ActionScript API のクラスで for..in ループを使用しても、ほとんどの場合、どのプロパティも表示されないことを意味します。それでも汎用型の Object は動的オブジェクトなので、for..in ループによってプロパティが表示されます。
次の例では、Object 型の汎用オブジェクトを作成し、そのオブジェクトにプロパティを追加してから、ボタンをクリックするときにオブジェクトを反復処理してプロパティを確認します。
<?xml version="1.0"?>
<!-- usingas/IntrospectionForIn.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">
<mx:Script><![CDATA[
private var obj:Object = new Object();
private function initApp():void {
// Create the object.
obj.a = "Schotten Totten";
obj.b = "Taj Majal";
obj.c = "Durche die Wuste";
}
public function dumpObj():void {
for (var p:String in obj) {
ta1.text += p + ":" + obj[p] + "\n";
}
}
]]></mx:Script>
<mx:TextArea id="ta1" width="400" height="200"/>
<mx:Button label="Dump Object" click="dumpObj()"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
また、mx.utils.ObjectUtil.toString() メソッドを使用して、オブジェクトの動的に追加されたプロパティをすべて出力することもできます。次に例を示します。
<?xml version="1.0"?>
<!-- usingas/ObjectUtilToString.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()">
<mx:Script><![CDATA[
import mx.utils.ObjectUtil;
private var obj:Object = new Object();
private function initApp():void {
// Create the object.
obj.a = "Schotten Totten";
obj.b = "Taj Majal";
obj.c = "Durche die Wuste";
}
public function dumpObj():void {
ta1.text = ObjectUtil.toString(obj);
}
]]></mx:Script>
<mx:TextArea id="ta1" width="400" height="200"/>
<mx:Button label="Dump Object" click="dumpObj()"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
mx.utils.ObjectUtil クラスにはその他にも、compare()、copy()、isSimple() などの便利なメソッドがあります。詳細については、『Adobe Flex リファレンスガイド』を参照してください。
非動的クラス(sealed クラス)またはクラスインスタンスのパブリックプロパティとメソッドをすべて列挙する場合は、describeType() メソッドを使用し、その結果を E4X API を使用して解析します。describeType() メソッドは flash.utils パッケージに含まれています。このメソッドは、イントロスペクトするターゲットオブジェクトのみをパラメータとして受け取ります。このパラメータには任意の ActionScript 値を渡すことができます。これには、使用可能なすべての ActionScript 型(オブジェクトインスタンスなど)、uint などのプリミティブ型、クラスオブジェクトなどが含まれます。describeType() メソッドの戻り値は、オブジェクトの型の XML 記述を含む E4X XML オブジェクトです。
describeType() メソッドはパブリックメンバーのみを返します。呼び出し元のスーパークラス、または呼び出し元がインスタンスでないその他のクラスのプライベートメンバーは返しません。describeType(this) を呼び出すと、クラスの非静的メンバーについてのみ情報が返されます。describeType(getDefinitionByName("MyClass")) を呼び出すと、ターゲットの静的メンバーについてのみ情報が返されます。
次の例は、Button コントロールをイントロスペクトして詳細を TextArea コントロールに出力します。
<?xml version="1.0"?>
<!-- usingas/IntrospectionAPI.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="getDetails()">
<mx:Script><![CDATA[
import flash.utils.*;
public function getDetails():void {
// Get the Button control's E4X XML object description.
var classInfo:XML = describeType(button1);
// Dump the entire E4X XML object into ta2.
ta2.text = classInfo.toString();
// List the class name.
ta1.text = "Class " + classInfo.@name.toString() + "\n";
// List the object's variables, their values, and their types.
for each (var v:XML in classInfo..variable) {
ta1.text += "Variable " + v.@name + "=" + button1[v.@name] +
" (" + v.@type + ")\n";
}
// List accessors as properties.
for each (var a:XML in classInfo..accessor) {
// Do not get the property value if it is write only.
if (a.@access == 'writeonly') {
ta1.text += "Property " + a.@name + " (" + a.@type +")\n";
}
else {
ta1.text += "Property " + a.@name + "=" +
button1[a.@name] + " (" + a.@type +")\n";
}
}
// List the object's methods.
for each (var m:XML in classInfo..method) {
ta1.text += "Method " + m.@name + "():" + m.@returnType + "\n";
}
}
]]></mx:Script>
<mx:Button label="Submit" id="button1"/>
<mx:TextArea id="ta1" width="400" height="200"/>
<mx:TextArea id="ta2" width="400" height="200"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
このコードの出力結果は次のようになります。Button コントロールのアクセサ、変数、およびメソッドが表示されます。
Class mx.controls::Button ... Variable id=button1 (String) Variable __width=66 (Number) Variable layoutWidth=66 (Number) Variable __height=22 (Number) Variable layoutHeight=22 (Number) ... Property label=Submit (String) Property enabled=true (Boolean) Property numChildren=2 (uint) Property enabled=true (Boolean) Property visible=true (Boolean) Property toolTip=null (String) ... Method dispatchEvent():Boolean Method hasEventListener():Boolean Method layoutContents():void Method getInheritingStyle():Object Method getNonInheritingStyle():Object
もう 1 つの便利なメソッドとして、ObjectUtil の getClassInfo() メソッドがあります。このメソッドは、ターゲットオブジェクトの名前とプロパティを格納した Object を返します。次の例は、getClassInfo() メソッドと toString() メソッドを使用して、Button コントロールのプロパティを表示しています。
<?xml version="1.0"?>
<!-- usingas/IntrospectionObjectUtil.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.controls.Alert;
import mx.utils.ObjectUtil;
private function showProps(b:Button):void {
var o:Object = ObjectUtil.getClassInfo(b);
ta1.text = ObjectUtil.toString(o);
}
]]></mx:Script>
<mx:Button id="b1" label="Show Properties" click="showProps(b1)"/>
<mx:TextArea id="ta1" width="300" height="500"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
E4X の使用の詳細については、ActionScript 3.0 のプログラミングを参照してください。
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート