Dart 使用镜像,如何获取对类的引用';什么方法?

Dart 使用镜像,如何获取对类的引用';什么方法?,dart,dart-mirrors,Dart,Dart Mirrors,假设我有一个类Foo的实例,我想获取一个以某种方式注释的所有方法的列表。我希望有一个对方法本身的引用,所以我不希望每次都使用反射来调用该方法,只是第一次获取对它的引用 换句话说,我想做与此等效的反射: class-Foo{ a(){print(“a”);} } void main(){ var f=新的Foo(); var x=f.a;//需要一种反射式的方法来实现这一点 x();//打印“a” } 我尝试过使用InstanceMirror#getField,但方法不被视为字段,因此不起作用。

假设我有一个类
Foo
的实例,我想获取一个以某种方式注释的所有方法的列表。我希望有一个对方法本身的引用,所以我不希望每次都使用反射来调用该方法,只是第一次获取对它的引用

换句话说,我想做与此等效的反射:

class-Foo{
a(){print(“a”);}
}
void main(){
var f=新的Foo();
var x=f.a;//需要一种反射式的方法来实现这一点
x();//打印“a”
}

我尝试过使用
InstanceMirror#getField
,但方法不被视为字段,因此不起作用。有什么想法吗?

据我所知,Dart中的反射无法得到您想要的实际方法。(如果有人出现并演示如何做,我将非常高兴地删除此答案。)

对于使用反射来调用该方法,我能想到的最好办法是:

导入“dart:mirrors”;
福班{
a(){print(“a”);}
}
void main(){
var f=新的Foo();
最终fMirror=反射(f);
最终aSym=新符号('a');
final x=()=>fMirror.invoke(aSym,[]);
x();//打印“a”
}
再说一次,我知道这不是你想要的,但我相信这是你能找到的最接近的


旁注:
getField
调用getter并返回结果——如果将getter实现为一个方法,则实际上没有问题。在这里,它不适用于您,但原因与您想象的不同。

您试图获得的将被描述为该方法的“克隆化”版本。也就是说,您希望将方法作为函数获取,其中接收方在函数调用中是隐式的。没有办法从镜子里得到这个。你也可以得到一面镜子 reflect(foo).type.methods[常量符号(“a”)]
但是你不能调用结果。

我不同意它真的是“closurizsd”。在问题x中给出的示例中,为实例变量“f”--“var x=f.a;”指定了方法。这就是说,这似乎是一种非常令人担忧的方式来讨论最终用户用例是什么(??)。Closurized是Dart中使用的术语,用于描述当您有一个实例方法,并且您将其作为可调用的对象(即闭包)引用时会发生什么。它可能不会关闭任何环境,但它保留了它所应用的实例。更传统的定义来自LISP,它是一个内部(或内部)结构,因此是匿名的“结构”。我的评论是,示例问题,希望实例f((词汇))的方法(Acthual)。同样,词汇上讲,这是实例*f的上下文中的一种方法。在大多数OO语言中,示例本身并不适用,对于那些可能像C++一样使用虚拟的语言,这就是A.()的方法。方法与类FOO的实例变量f关联。我希望这能澄清这一评论。我不熟悉“structure”的术语,但在LISP中,我会将其视为关闭其环境的函数。如果您考虑将方法克隆为f.a returning()=>f.a()。也就是说,它返回一个关闭实例的闭包。