基礎練その9 Reflection

えー、だいぶ飛び飛びで発散気味ですが、ご容赦を。

AS3でReflectionをやるにはどうすればいいか。

mx.utils.DescribeTypeCacheなるクラスがあるのでこいつを使えばXMLには変換してくれそうです。

var xml:XML = describeType(Greeter);


これだけ。ちなみに元のクラスはこれ。

package
{
	public class Greeter
	{
		public static var validName:Array = ["a", "b", "c"];
		public function greet(s:String = ""):String
		{
			var str:String;
			if(s == "")
			{
				s = "AAA";
			} else if(validNames(s))
			{
				s = "BBB";
			} else {
				s = "CCC";
			}
			return s;
		}
		
		public static function validNames(input:String = ""):Boolean
		{
			if(validName.indexOf(input) > -1)
			{
				return true;
			} else {
				return false;
			}
		}
		
		public static function greeterName():String {
			return "simple greeter";
		}
	}
}


あとはE4XでひたすらXMLをwalkするのかねえ。

もともとのクラスをこんなのとすると、出てくるXMLは、

<type name="Greeter" base="Object" isDynamic="false" isFinal="false" isStatic="false">
  <extendsClass type="Object"/>
  <method name="greet" declaredBy="Greeter" returnType="String">
    <parameter index="1" type="String" optional="true"/>
  </method>
</type>


こんなん。

で、こっからE4Xでゲトしてくと。

trace(xml.@name); //Greeter
trace(xml.extendsClass); //<extendsClass type="Object"/>
trace(xml.method.@returnType); //String だけしか出ないはずなのに、なぜかStringBooleanと出るw


でもなあ、ちょっと面倒くさい。


昨日勉強会で発表していたyossyさんが主催しているSparkプロジェクトの

ASReflectのコードを見ると、ここからもう一歩踏み込んで、package情報とか取れるようにしてそう。

ちょっとだけしか見てないけど。

でも便利そうなので、もう少し使ってみるです。


(追記)

お、getDefinitionByName()なるものがあるみたい。

var o:Object = getDefinitionByName("Greeter");
var c:Class = Class(o);


こんなんでインスタンス化されるみたい。