noSuchMethod 方法
- Invocation invocation
当访问不存在的方法或属性时被调用。
动态成员调用尝试调用接收对象上不存在的方法。示例
dynamic object = 1;
object.add(42); // Statically allowed, run-time error
此无效代码将调用整数 1
的 noSuchMethod
方法,并通过 Invocation 对象表示的 .add(42)
调用和参数(然后抛出异常)。
类可以重写 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
,因此此代码将记录类似于 Invocation.method(#add, [42])
的调用,然后抛出异常。
如果从 noSuchMethod
返回值,它将成为原始调用的结果。如果返回值不是原始调用可以返回的类型,则在调用时发生类型错误。
默认行为是抛出 NoSuchMethodError。
实现
@pragma("vm:entry-point")
@pragma("wasm:entry-point")
external dynamic noSuchMethod(Invocation invocation);