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<_JavaMethod> overloads = _clazz._methods[invocation.memberName]; if (overloads == null) throw new JavaError('Method ${invocation.memberName} not found'); _JavaMethod method = _findMatchingMethod(overloads, invocation.positionalArguments); List args = _convertArgumentsToJava(invocation.positionalArguments, method); if (method.returnType == _JavaPrimitive.jvoid) { return _object.callVoidMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jboolean) { return _object.callBooleanMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jbyte) { return _object.callByteMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jchar) { return _object.callCharMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jshort) { return _object.callShortMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jint) { return _object.callIntMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jlong) { return _object.callLongMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jfloat) { return _object.callFloatMethod(method.methodId, args); } else if (method.returnType == _JavaPrimitive.jdouble) { return _object.callDoubleMethod(method.methodId, args); } else { return _javaObjectToDart( _object.callObjectMethod(method.methodId, args)); } } if (invocation.isGetter) { _JavaField field = _clazz._fields[invocation.memberName]; if (field == null) throw new JavaError('Field ${invocation.memberName} not found'); if (field.type == _JavaPrimitive.jboolean) { return _object.getBooleanField(field.fieldId); } else if (field.type == _JavaPrimitive.jbyte) { return _object.getByteField(field.fieldId); } else if (field.type == _JavaPrimitive.jchar) { return _object.getCharField(field.fieldId); } else if (field.type == _JavaPrimitive.jshort) { return _object.getShortField(field.fieldId); } else if (field.type == _JavaPrimitive.jint) { return _object.getIntField(field.fieldId); } else if (field.type == _JavaPrimitive.jlong) { return _object.getLongField(field.fieldId); } else if (field.type == _JavaPrimitive.jfloat) { return _object.getFloatField(field.fieldId); } else if (field.type == _JavaPrimitive.jdouble) { return _object.getDoubleField(field.fieldId); } else { return _javaObjectToDart(_object.getObjectField(field.fieldId)); } } if (invocation.isSetter) { _JavaField field = _clazz._fields[invocation.memberName]; if (field == null) throw new JavaError('Field ${invocation.memberName} not found'); dynamic value = invocation.positionalArguments[0]; if (field.type == _JavaPrimitive.jboolean) { _object.setBooleanField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jbyte) { _object.setByteField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jchar) { _object.setCharField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jshort) { _object.setShortField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jint) { _object.setIntField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jlong) { _object.setLongField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jfloat) { _object.setFloatField(field.fieldId, value); } else if (field.type == _JavaPrimitive.jdouble) { _object.setDoubleField(field.fieldId, value); } else { _object.setObjectField(field.fieldId, _dartObjectToJava(value, field.type)); } return null; } throw new JavaError('Unable to access ${invocation.memberName}'); }