我有两个类 Parser
和 Proxy
,当我从 Parser
调用一个不存在的方法时,它会将它委托给 Proxy
class .
我的代码:
class Parser {
noSuchMethod(Invocation invocation) {
// how to pass the `invocation` to `Proxy`???
}
}
class Proxy {
static String hello() { return "hello"; }
static String world() { return "world"; }
}
我写的时候:
var parser = new Parser();
print(parser.hello());
它将打印:
hello
4 回答
你必须使用dart:mirrors . 这是怎么做的:
亚历山大的答案是正确的,但我想补充一些东西 .
我假设
Proxy
的委托是一个实现细节,我们不希望用户暴露给它 . 在这种情况下,我们应该对在parser
上调用Proxy
不支持的方法的情况进行一些处理 . 现在,如果你这样做:你收到这个错误:
我会在
noSuchMethod
中编写一些不同的代码 . 在委托给Proxy
之前,我会检查Proxy
是否支持我要调用的方法 . 如果Proxy
支持它,我将调用Proxy
上的方法,正如Alexandre在他的回答中所描述的那样 . 如果Proxy
不支持该方法,我会抛出一个NoSuchMethodError
.以下是答案的修订版:
以下是运行此代码的输出:
我还要补充一点,如果你想要委托的东西是固定的,你可以避免使用镜像,你可以合理地硬编码 . 如果你使用的是静态方法,这一点特别容易,但我不清楚为什么你这样做 . 我认为以下内容适用于实例方法和静态方法,但是我在没有实际尝试的情况下输入此代码...
如果转发的方法集发生变化,这很脆弱,但如果使用镜像(目前几乎所有树抖动都禁用),可能有助于避免代码大小增加 .
这个例子也可以帮助你理解: