开发者

Get AS3 instance method reference from Class object

开发者 https://www.devze.com 2023-03-07 15:36 出处:网络
class Foo { public function bar():void { ... } } var clazz:Class = Foo; // ...enter the function (no Foo literal here)
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(), ...);

What is the correct way to do the above? The Java equivalent of what I want to do is:

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

Actual code (with workaround):

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);
    }
}


Here the function bar only exist when your class is instanciated :

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

if you want to access it directlty you have to make it static:

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

now you can access your function from the class Foo:

var fun:Function = Foo.bar

or

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


I am not sure about what you are intending to do.

However AS3Commons, especially the reflect package have API's that let you work with methods, instances and properties of a class.

There are also API methods to create instances of certain class types on the fly and call their respective methods.

Cheers


It's not

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

Use instead since no parameters are required for the function

fun.call(clazz);

The first parameter as specified by adobe docs.
An object that specifies the value of thisObject within the function body.


[EDIT]
Forgot to point out you have to instantiate a non-static class with the "new" keyword.

var clazz:Class = new Foo();

[EDIT2]
Ok I played around and think I got what you want.

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( );


My workaround is to store the function name instead of the Function object.

var fun:String = "bar";

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

精彩评论

暂无评论...
验证码 换一张
取 消