static boolean allAssignable(boolean varArgs, Class[] parameterTypes, Class[] argumentTypes) { if (varArgs) { if (argumentTypes.length < parameterTypes.length - 1) { return false; } } else { if (parameterTypes.length != argumentTypes.length) { return false; } } for (int i = 0; i < argumentTypes.length; i++) { Class parameterType = !varArgs || i < parameterTypes.length - 1 ? parameterTypes[i] : Object.class; if (!assignableFrom(parameterType, argumentTypes[i])) { return false; } } return true; }