dynamic noSuchMethod(Invocation invocation)

Invoked when a non-existent method or property is accessed.

Classes can override noSuchMethod to provide custom behavior.

If a value is returned, it becomes the result of the original invocation.

The default behavior is to throw a NoSuchMethodError.

Source

dynamic noSuchMethod(Invocation invocation) {
  if (invocation.isMethod) {
    List<_HasArguments> overloads;
    bool isConstructor = (invocation.memberName == _newInstanceSymbol);
    if (isConstructor) {
      overloads = _constructors;
    } else {
      overloads = _staticMethods[invocation.memberName];
      if (overloads == null)
        throw new JavaError('Static method ${invocation.memberName} not found');
    }

    _HasArguments method = _findMatchingMethod(overloads, invocation.positionalArguments);
    List args = _convertArgumentsToJava(invocation.positionalArguments, method);

    if (isConstructor) {
      return new JavaObject(_clazz.newObject(method.methodId, args));
    }

    _JavaType returnType = (method as _JavaMethod).returnType;
    if (returnType == _JavaPrimitive.jvoid) {
      return _clazz.callStaticVoidMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jboolean) {
      return _clazz.callStaticBooleanMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jbyte) {
      return _clazz.callStaticByteMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jchar) {
      return _clazz.callStaticCharMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jshort) {
      return _clazz.callStaticShortMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jint) {
      return _clazz.callStaticIntMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jlong) {
      return _clazz.callStaticLongMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jfloat) {
      return _clazz.callStaticFloatMethod(method.methodId, args);
    } else if (returnType == _JavaPrimitive.jdouble) {
      return _clazz.callStaticDoubleMethod(method.methodId, args);
    } else {
      return _javaObjectToDart(
          _clazz.callStaticObjectMethod(method.methodId, args));
    }
  }

  if (invocation.isGetter) {
    _JavaField field = _staticFields[invocation.memberName];
    if (field == null)
      throw new JavaError('Static field ${invocation.memberName} not found');

    if (field.type == _JavaPrimitive.jboolean) {
      return _clazz.getStaticBooleanField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jbyte) {
      return _clazz.getStaticByteField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jchar) {
      return _clazz.getStaticCharField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jshort) {
      return _clazz.getStaticShortField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jint) {
      return _clazz.getStaticIntField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jlong) {
      return _clazz.getStaticLongField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jfloat) {
      return _clazz.getStaticFloatField(field.fieldId);
    } else if (field.type == _JavaPrimitive.jdouble) {
      return _clazz.getStaticDoubleField(field.fieldId);
    } else {
      return _javaObjectToDart(_clazz.getStaticObjectField(field.fieldId));
    }
  }

  if (invocation.isSetter) {
    _JavaField field = _staticFields[invocation.memberName];
    if (field == null)
      throw new JavaError('Static field ${invocation.memberName} not found');

    dynamic value = invocation.positionalArguments[0];

    if (field.type == _JavaPrimitive.jboolean) {
      _clazz.setStaticBooleanField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jbyte) {
      _clazz.setStaticByteField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jchar) {
      _clazz.setStaticCharField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jshort) {
      _clazz.setStaticShortField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jint) {
      _clazz.setStaticIntField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jlong) {
      _clazz.setStaticLongField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jfloat) {
      _clazz.setStaticFloatField(field.fieldId, value);
    } else if (field.type == _JavaPrimitive.jdouble) {
      _clazz.setStaticDoubleField(field.fieldId, value);
    } else {
      _clazz.setStaticObjectField(field.fieldId, _dartObjectToJava(value, field.type));
    }

    return null;
  }

  throw new JavaError('Unable to access ${invocation.memberName}');
}