in empire-db/src/main/java/org/apache/empire/commons/ClassUtils.java [547:603]
public static Object invokeMethod(Class<?> clazz, Object object, String methodName, Class<?>[] paramTypes, Object[] paramValues, boolean makeAccessible)
{
// check arguments
if (clazz==null || !clazz.isInstance(object))
throw new InvalidArgumentException("clazz", clazz);
if (StringUtils.isEmpty(methodName))
throw new InvalidArgumentException("methodName", methodName);
// method parameters
boolean hasMethodParams = (paramTypes!=null && paramTypes.length>0);
if (hasMethodParams && (paramValues==null || paramValues.length!=paramTypes.length))
throw new InvalidArgumentException("paramValues", paramValues);
// begin
boolean accessible = true;
Method method = null;
try
{ // find method and invoke
if (hasMethodParams)
method = (makeAccessible ? clazz.getDeclaredMethod(methodName, paramTypes) : clazz.getMethod(methodName, paramTypes));
else
method = (makeAccessible ? clazz.getDeclaredMethod(methodName) : clazz.getMethod(methodName));
// set Accessible
accessible = method.isAccessible();
if (makeAccessible && accessible==false)
method.setAccessible(true);
// invoke
if (hasMethodParams)
return method.invoke(object, paramValues);
else
return method.invoke(object);
}
catch (NoSuchMethodException e)
{ // No such Method
if (makeAccessible)
{ // try superclass
clazz = clazz.getSuperclass();
if (clazz!=null && !clazz.equals(java.lang.Object.class))
return invokeMethod(clazz, object, methodName, paramTypes, paramValues, true);
}
// not found
if (hasMethodParams)
methodName += StringUtils.concat("({", String.valueOf(paramTypes.length), " params})");
throw new NotImplementedException(object, methodName);
}
catch (IllegalAccessException | InvocationTargetException e)
{ // ReflectiveOperationException
throw new BeanMethodInvokeException(object, methodName, e);
}
catch (SecurityException | IllegalArgumentException e)
{ // RuntimeException
throw new BeanMethodInvokeException(object, methodName, e);
}
finally {
// restore accessible
if (method!=null && accessible==false)
method.setAccessible(false);
}
}