从Class对象获取AS3实例方法引用

时间:2011-05-23 13:11:39

标签: actionscript-3 function reflection function-pointers

class Foo {
   public function bar():void { ... }
}

var clazz:Class = Foo;

// ...enter the function (no Foo literal here)
var fun:Function = clazz["bar"]; // PROBLEM: returns null

// later
fun.call(new Foo(), ...);

上述方法的正确方法是什么?与我想做的Java相当的是:

Method m = Foo.class.getMethod("bar", ...);
m.invoke(new Foo(), ...);

实际代码(含解决方法):

class SerClass {

    public var className:String;
    public var name:String;
    private var ser:String = null;
    private var unser:Function = null;

    public function SerClass(clazz:Class):void {

        var type:XML = describeType(clazz);

        className = type.@name;

        // determine name
        name = type.factory.metadata.(@name=="CompactType").arg.(@key=="name").@value;

        // find unserializer
        var mdesc:XML = XML(type.method.metadata.(@name=="Unserialize")).parent();
        if (mdesc is XML) {
            unser = clazz[mdesc.@name];
        }

        // find serializer
        var sdesc:XML = XML(type.factory.method.metadata.(@name=="Serialize")).parent();
        if (sdesc is XML) {
            ser = sdesc.@name;
        }


    }
    public function serialize(obj:Object, ous:ByteArray):void {
        if (ser == null) throw new Error(name + " is not serializable");
        obj[ser](ous);
    }
    public function unserialize(ins:ByteArray):Object {
        if (unser == null) throw new Error(name + " is not unserializable");
        return unser.call(null, ins);
    }
}

4 个答案:

答案 0 :(得分:2)

此处功能栏仅在您的班级实例化时才存在:

var foo:Foo = new Foo()
var fun:Function = foo.bar // <-- here you can get the function from the new instance

如果你想直接访问它,你必须让它静止:

class Foo {
 public static function bar():void{ ... }
}

现在您可以从类Foo:

访问您的函数
var fun:Function = Foo.bar

var clazz:Class = Foo
var fun:Function = clazz["bar"]

答案 1 :(得分:1)

我不确定你打算做什么。

但是AS3Commons,尤其是反射包具有API,可以让您使用类的方法,实例和属性。

还有一些API方法可以动态创建某些类类型的实例并调用它们各自的方法。

干杯

答案 2 :(得分:0)

不是

 fun.call(new Foo(), ...);

请改用,因为函数

不需要参数
fun.call(clazz);

adobe docs指定的第一个参数 一个对象,它指定函数体中thisObject的值。


[编辑]
忘了指出你必须使用“new”关键字实例化一个非静态类。

var clazz:Class = new Foo();

[EDIT2]
好的,我玩了一下,觉得我得到了你想要的东西。

base.as

package{
  public class Base {
    public function Base() {
      trace('Base constructor')
    }
    public function someFunc( ){
      trace('worked');
    }
  }
}



//called with 
var b:Base = new Base( );// note I am not type casting to Class
var func:Function = b.someFunc;
func.call( );

答案 3 :(得分:-1)

我的解决方法是存储函数名称而不是Function对象。

var fun:String = "bar";

// later...
new Foo()[fun](...);