結局Functionから直接引数やメソッド名を取得することが出来なかったため、目先を変えて
メタデータを試してみた。
とりあえず「ARGS」メタデータをコンパイル時に残すように設定。
まず「metadata.xml」の名前で以下のXMLをプロジェクト直下に保存。
<?xml version="1.0"?> <flex-config xmlns="http://www.adobe.com/2006/flex-config"> <compiler> <keep-as3-metadata> <name>ARGS</name> </keep-as3-metadata> </compiler> </flex-config>
次にプロジェクトのコンパイラー設定。
-load-config+=metadata.xml
をコンパイラー引数に設定。
で、以下のコードを実行
//クラス定義 package{ public class FunctionTest{ public var value:int; [ARGS(length=2)] public function test(arg:String,arg2:String="default"):void{ trace(arg + value + arg2); } } } //実行 public function main():void { var functionTest:FunctionTest = new FunctionTest(); trace("----インスタンス"); trace(describeType(functionTest)); trace("----Function"); var f:Function = functionTest.test; trace(describeType(f)); }
結果はこれ
----インスタンス <type name="FunctionTest" base="Object" isDynamic="false" isFinal="false" isStatic="false"> <extendsClass type="Object"/> <variable name="value" type="int"/> <method name="test" declaredBy="FunctionTest" returnType="void"> <parameter index="1" type="String" optional="false"/> <parameter index="2" type="String" optional="true"/> <metadata name="ARGS"> <arg key="length" value="2"/> </metadata> </method> </type> ----Function <type name="builtin.as$0::MethodClosure" base="Function" isDynamic="false" isFinal="true" isStatic="false"> <extendsClass type="Function"/> <extendsClass type="Object"/> <accessor name="prototype" access="readwrite" type="*" declaredBy="builtin.as$0::MethodClosure"/> <accessor name="length" access="readonly" type="int" declaredBy="builtin.as$0::MethodClosure"/> </type>
予想してたとはいえ、結局メタデータ取れじ。
まあ、あきらめます。メタデータが意外と簡単に使えることが分かっただけよしとしましょう・・・