noSuchMethod 方法
- Invocation invocation
当访问不存在的方法或属性时被调用。
动态成员调用尝试调用接收对象上不存在的方法。例如
dynamic object = 1;
object.add(42); // Statically allowed, run-time error
以下无效代码将调用整数 1
的 noSuchMethod
方法,并带有代表 .add(42)
调用和参数的 Invocation(然后抛出异常)。
类可以覆盖 noSuchMethod 以提供此类无效动态调用的高级行为。
具有非默认 noSuchMethod 调用的类也可以省略其实例方法。例如
class MockList<T> implements List<T> {
noSuchMethod(Invocation invocation) {
log(invocation);
super.noSuchMethod(invocation); // Will throw.
}
}
void main() {
MockList().add(42);
}
该代码没有编译时间警告或错误,即使 MockList
类没有实现 List
接口方法的任何具体实现。对 List
方法的调用被转发到 noSuchMethod
,因此该代码将 log
一个类似于 Invocation.method(#add, [42])
的调用,然后抛出异常。
如果从 noSuchMethod
返回一个值,它将成为原始调用的结果。如果返回的值不是原始调用可以返回的类型,则在调用处发生类型错误。
默认行为是抛出 NoSuchMethodError 异常。
实现
@pragma("vm:entry-point")
@pragma("wasm:entry-point")
external dynamic noSuchMethod(Invocation invocation);