基礎練その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"; } } }
もともとのクラスをこんなのとすると、出てくる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);
こんなんでインスタンス化されるみたい。