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