获取函数引用的函数的全名

时间:2014-05-13 15:12:08

标签: actionscript-3 function reflection

如果仅给出对函数的引用,如何在Actionscript中获取静态函数的完整类路径?请参阅以下代码示例:

public class Tests {
     static function myFunc():void {}
}

var func:Function = Tests.myFunc;

trace(func.?) // should trace "Tests.myFunc"

这可能吗?即使是开源编辑器和调试器FlashDevelop也无法做到这一点。尝试使用函数ref滚动对象,它显示原始指针(如12341234)而不是函数的全名。当然,使用describeType,您可以获得有关类型的信息,即。一个类引用,但不是只有一个函数引用。只给出函数引用,你如何得到它的名字?

1 个答案:

答案 0 :(得分:1)

一般情况下不可能,仅提及该功能(如本受理回答Actionscript - Obtain the name of the current function中所述)。获得名称的方法只有两种:

  1. 使用describeType,但在这种情况下,您必须提供函数主机对象。您可以在第一个答案Actionscript - Obtain the name of the current function中找到示例,我也为静态函数修改了它,并使用仅在调试播放器中工作的getSavedThis

    var name:String = getFunctionName( staticTest );
    trace("1", name);
    name = getFunctionName( staticTest, Astest ); //Astest the name of the class that hosts staticTest function
    trace("2", name);
    
    public static function staticTest():void
    {
    
    }
    
    public static function getFunctionName( func:Function, parent:* = null ):String
    {
        if(!parent)
        {
            //works only in debug flash player
            parent = getSavedThis(staticTest);
        }
    
        var methods:XMLList = describeType(parent)..method;
        for each ( var m:XML in methods)
        {
            if (parent[m.@name] == func)
                return m.@name;
        }
        return null;
    }
    
  2. 输出:

    [trace] 1 staticTest
    [trace] 2 staticTest
    
    1. 使用 getStackTrace (相同答案中的示例),但它仅适用于调试播放器,您必须处于函数闭包中。