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}'); }