noSuchMethod 方法

dynamic noSuchMethod(
  1. Invocation invocation
)

当访问不存在的方法或属性时被调用。

动态成员调用尝试调用接收对象上不存在的方法。例如

dynamic object = 1;
object.add(42); // Statically allowed, run-time error

以下无效代码将调用整数 1noSuchMethod 方法,并带有代表 .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);