in src/main/java/org/apache/bsf/util/MethodUtils.java [208:286]
static private Object getEntryPoint(final Class targetClass, final String methodName, final Class[] argTypes, final boolean isStaticReference)
throws SecurityException, NoSuchMethodException {
// 15.11.1: OBTAIN STARTING CLASS FOR SEARCH
Object m = null;
// 15.11.2 DETERMINE ARGUMENT SIGNATURE
// (Passed in as argTypes array.)
// Shortcut: If an exact match exists, return it.
try {
if (methodName != null) {
m = targetClass.getMethod(methodName, argTypes);
if (isStaticReference && !Modifier.isStatic(entryGetModifiers(m))) {
throw new NoSuchMethodException(callToString(targetClass, methodName, argTypes, isStaticReference) + " resolved to instance " + m);
}
return m;
} else {
return targetClass.getConstructor(argTypes);
}
} catch (final NoSuchMethodException e) {
// no-args has no alternatives!
if (argTypes == null || argTypes.length == 0) {
throw new NoSuchMethodException(callToString(targetClass, methodName, argTypes, isStaticReference) + " not found.");
}
// Else fall through.
}
// Well, _that_ didn't work. Time to search for the Most Specific
// matching function. NOTE that conflicts are possible!
// 15.11.2.1 ACCESSIBLE: We apparently need to gather from two
// sources to be sure we have both instance and static methods.
Object[] methods;
if (methodName != null) {
methods = targetClass.getMethods();
} else {
methods = targetClass.getConstructors();
}
if (0 == methods.length) {
throw new NoSuchMethodException("No methods!");
}
final MoreSpecific best = new MoreSpecific();
for (int i = 0; i < methods.length; ++i) {
final Object mi = methods[i];
if (
// 15.11.2.1 ACCESSIBLE: Method is public.
Modifier.isPublic(entryGetModifiers(mi)) &&
// 15.11.2.1 APPLICABLE: Right method name (or constructor)
(methodName == null || entryGetName(mi).equals(methodName)) &&
// 15.11.2.1 APPLICABLE: Parameters match arguments
areMethodConvertable(entryGetParameterTypes(mi), argTypes)) {
// 15.11.2.2 MORE SPECIFIC displace less specific.
best.addItem(mi);
}
}
// May throw NoSuchMethodException; we pass in info needed to
// create a useful exception
m = best.getMostSpecific(targetClass, methodName, argTypes, isStaticReference);
// 15.11.3 APPROPRIATE: Class invocation can call only static
// methods. Note that the defined order of evaluation permits a
// call to be resolved to an inappropriate method and then
// rejected, rather than finding the best of the appropriate
// methods.
//
// Constructors are never static, so we don't test them.
if (m == null) {
throw new NoSuchMethodException(callToString(targetClass, methodName, argTypes, isStaticReference) + " -- no signature match");
}
if (methodName != null && isStaticReference && !Modifier.isStatic(entryGetModifiers(m))) {
throw new NoSuchMethodException(callToString(targetClass, methodName, argTypes, isStaticReference) + " resolved to instance: " + m);
}
return m;
}