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);
}
}
答案 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)
答案 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](...);