【问题标题】:Class reflection from a static method来自静态方法的类反射
【发布时间】:2010-12-16 12:45:03
【问题描述】:

我正在使用出色的 org.as3commons.reflectorg.as3commons.lang 库,但遇到了问题。我的一个类中有一个静态方法,需要对 its 类进行反射。反射库有一个 Type.forClass(clazz:Class) 静态方法,它显然需要一个 Class 变量。静态方法/代码中不允许使用 this 关键字,所以现在我需要知道是否有办法获取正在调用我的静态方法的类。

我需要在 Flash 播放器的非调试版本中工作的东西,所以任何 Error.getStackTrace() 技巧都不起作用。太糟糕了,普通 VM 中没有可用的堆栈跟踪。

import org.as3commons.lang.ClassUtils;
import org.as3commons.reflect.Type;

protected static function doReflection(): void
{
  var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods
  var ct: Type = Type.forClass(aClass);
  // do stuff with type
}

我放弃了在 Google 和其他网站上搜索;总能得到关于静态成员、性能问题、一切的教程和技巧,除了我正在寻找的东西。

总的来说,我想在静态成员中缓存一些关于类的东西,以便在每次实例化类时节省不必要的工作。

任何帮助将不胜感激。

【问题讨论】:

    标签: actionscript-3 class reflection static


    【解决方案1】:

    将引用作为静态方法的参数传递给您需要的实例怎么样?

    【讨论】:

    • 类的第一次实例化时调用静态方法,类似于 protected static var _classInitialized: Boolean = init();好的,所以代码将变成类似“所有实例检查类是否已初始化,如果没有,则调用受保护的静态函数 init(this)”。希望有更直接的方法,但那会奏效,谢谢。
    【解决方案2】:

    它可能不适用于所有情况...主要取决于您的构造函数发生的情况。

    import org.as3commons.lang.ClassUtils;
    import org.as3commons.reflect.Type;
    
    static private const CLASS:Object = new YourReflectedClass;
    
    protected static function doReflection(): void {
    
     // var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods
    
      var aClass:Class = CLASS.constructor;
    
      var ct: Type = Type.forClass(aClass);
      // do stuff with type
    }
    

    更好的方法是使用:

    static private const CLASS:Class = YourReflectedClass;
    var ct: Type = Type.forClass(CLASS);
    

    只是想向您展示 Object.constructor 方法...

    【讨论】:

    • 不错的方法,那个 Object.constructor 的东西,虽然问题是在没有实例的情况下找到类本身;我知道 A 类在其定义中是 A 类,但如果 B 类是 A 类的子类则不是。我在写完这个问题后不久注意到的另一个问题是 as3 在静态成员的继承方面很奇怪,所以我不知道这是否对我的目的有用;我可能要撞墙了。具体来说,A 类中的静态变量对于 B 类和 C 类是唯一的吗?很难找到关于该主题的权威文档;我还在挖。
    • @Alan G. 静态 var 继承的一点研究:wonderfl.net/c/lLor
    • @www0z0k 谢谢,这是一个有趣的演示。
    【解决方案3】:

    我认为在调试模式下,您可以使用错误对象的堆栈跟踪从静态上下文中检索/反映类,但在发布版本中,您必须获得全局范围来反映:

    //RELEASE BUILD
    public static function whoAmI():void
    {    
        var clsName:String = describeType((function m():*{return this})()).constant.@type;
        var cls:Class = getDefinitionByName(clsName) as Class;
    }
    
    //DEBUG MODE (getStackTrace()-hack)
    public static function whoAmI():void
    {    
        var stack:Array = new Error().getStackTrace().replace("Error\n","").split("\n");
        //write your stack-trace parser here
        var clsName:String = ...
        var cls:Class = getDefinitionByName(clsName) as Class;
    }
    

    【讨论】:

      【解决方案4】:

      这个呢:

      protected static function doReflection(): void
      {
          var aClass: Class = ClassThatYouAreIn as Class; 
          var ct: Type = Type.forClass(aClass);
          // do stuff with type
      }
      

      因为静态方法甚至不被继承...

      编辑:好的,我刚刚看到这已经被提议了......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 2018-10-30
        • 2012-08-08
        • 2012-03-26
        相关资源
        最近更新 更多