return isAssignable(cls, toClass, true);
return isAssignable(classArray, toClassArray, true);
/** * <p>Returns the aggregate number of inheritance hops between assignable argument class types. Returns -1 * if the arguments aren't assignable. Fills a specific purpose for getMatchingMethod and is not generalized.</p> * @param classArray * @param toClassArray * @return the aggregate number of inheritance hops between assignable argument class types. */ private static int distance(final Class<?>[] classArray, final Class<?>[] toClassArray) { int answer = 0; if (!ClassUtils.isAssignable(classArray, toClassArray, true)) { return -1; } for (int offset = 0; offset < classArray.length; offset++) { // Note InheritanceUtils.distance() uses different scoring system. if (classArray[offset].equals(toClassArray[offset])) { continue; } else if (ClassUtils.isAssignable(classArray[offset], toClassArray[offset], true) && !ClassUtils.isAssignable(classArray[offset], toClassArray[offset], false)) { answer++; } else { answer = answer + 2; } } return answer; }
private static boolean isMatchingExecutable(final Executable method, final Class<?>[] parameterTypes) { final Class<?>[] methodParameterTypes = method.getParameterTypes(); if (ClassUtils.isAssignable(parameterTypes, methodParameterTypes, true)) { return true; } if (method.isVarArgs()) { int i; for (i = 0; i < methodParameterTypes.length - 1 && i < parameterTypes.length; i++) { if (!ClassUtils.isAssignable(parameterTypes[i], methodParameterTypes[i], true)) { return false; } } final Class<?> varArgParameterType = methodParameterTypes[methodParameterTypes.length - 1].getComponentType(); for (; i < parameterTypes.length; i++) { if (!ClassUtils.isAssignable(parameterTypes[i], varArgParameterType, true)) { return false; } } return true; } return false; }
if (destClass.isInterface() && ClassUtils.isAssignable(srcClass, destClass)) {
if (!isAssignable(classArray[i], toClassArray[i], autoboxing)) { return false;
return method; } else if (methodName.equals(method.getName()) && ClassUtils.isAssignable(parameterTypes, method.getParameterTypes(), true)) { if (inexactMatch == null) { inexactMatch = method;
return ClassUtils.isAssignable((Class<?>) type, toClass);
@Override public Acknowledgement recover(RetryContext context) throws Exception { RocketMQInboundChannelAdapter.this.recoveryCallback .recover(context); if (ClassUtils.isAssignable(this.getClass(), MessageListenerConcurrently.class)) { return Acknowledgement .buildConcurrentlyInstance(); } else { return Acknowledgement.buildOrderlyInstance(); } } });
@Test public void test_isAssignable_NoAutoboxing() throws Exception { assertFalse(ClassUtils.isAssignable((Class<?>) null, null, false)); assertFalse(ClassUtils.isAssignable(String.class, null, false)); assertTrue(ClassUtils.isAssignable(null, Object.class, false)); assertTrue(ClassUtils.isAssignable(null, Integer.class, false)); assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, false)); assertTrue(ClassUtils.isAssignable(String.class, Object.class, false)); assertTrue(ClassUtils.isAssignable(String.class, String.class, false)); assertFalse(ClassUtils.isAssignable(Object.class, String.class, false)); assertFalse(ClassUtils.isAssignable(Integer.TYPE, Integer.class, false)); assertFalse(ClassUtils.isAssignable(Integer.TYPE, Object.class, false)); assertFalse(ClassUtils.isAssignable(Integer.class, Integer.TYPE, false)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, false)); assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, false)); assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, false)); assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Object.class, false)); assertFalse(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, false)); assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, false)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, false)); assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, false)); }
@Test public void test_isAssignable_Autoboxing() throws Exception { assertFalse(ClassUtils.isAssignable((Class<?>) null, null, true)); assertFalse(ClassUtils.isAssignable(String.class, null, true)); assertTrue(ClassUtils.isAssignable(null, Object.class, true)); assertTrue(ClassUtils.isAssignable(null, Integer.class, true)); assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, true)); assertTrue(ClassUtils.isAssignable(String.class, Object.class, true)); assertTrue(ClassUtils.isAssignable(String.class, String.class, true)); assertFalse(ClassUtils.isAssignable(Object.class, String.class, true)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.class, true)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Object.class, true)); assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE, true)); assertTrue(ClassUtils.isAssignable(Integer.class, Object.class, true)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, true)); assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, true)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, true)); assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true)); assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, true)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, true)); assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, true)); }
@Test public void test_isAssignable() throws Exception { assertFalse(ClassUtils.isAssignable((Class<?>) null, null)); assertFalse(ClassUtils.isAssignable(String.class, null)); assertTrue(ClassUtils.isAssignable(null, Object.class)); assertTrue(ClassUtils.isAssignable(null, Integer.class)); assertFalse(ClassUtils.isAssignable(null, Integer.TYPE)); assertTrue(ClassUtils.isAssignable(String.class, Object.class)); assertTrue(ClassUtils.isAssignable(String.class, String.class)); assertFalse(ClassUtils.isAssignable(Object.class, String.class)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.class)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Object.class)); assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE)); assertTrue(ClassUtils.isAssignable(Integer.class, Object.class)); assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE)); assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Object.class)); assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE)); assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class)); assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE)); assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class)); }
@Test public void test_isAssignable_ClassArray_ClassArray_Autoboxing() throws Exception { final Class<?>[] array2 = new Class[] {Object.class, Object.class}; final Class<?>[] array1 = new Class[] {Object.class}; final Class<?>[] array1s = new Class[] {String.class}; final Class<?>[] array0 = new Class[] {}; final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE }; final Class<?>[] arrayWrappers = { Integer.class, Boolean.class }; assertFalse(ClassUtils.isAssignable(array1, array2, true)); assertFalse(ClassUtils.isAssignable(null, array2, true)); assertTrue(ClassUtils.isAssignable(null, array0, true)); assertTrue(ClassUtils.isAssignable(array0, array0, true)); assertTrue(ClassUtils.isAssignable(array0, null, true)); assertTrue(ClassUtils.isAssignable((Class[]) null, null, true)); assertFalse(ClassUtils.isAssignable(array1, array1s, true)); assertTrue(ClassUtils.isAssignable(array1s, array1s, true)); assertTrue(ClassUtils.isAssignable(array1s, array1, true)); assertTrue(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, true)); assertTrue(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, true)); assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, true)); assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, true)); assertTrue(ClassUtils.isAssignable(arrayPrimitives, array2, true)); assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, true)); }
@Test public void test_isAssignable_ClassArray_ClassArray() throws Exception { final Class<?>[] array2 = new Class[] {Object.class, Object.class}; final Class<?>[] array1 = new Class[] {Object.class}; final Class<?>[] array1s = new Class[] {String.class}; final Class<?>[] array0 = new Class[] {}; final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE }; final Class<?>[] arrayWrappers = { Integer.class, Boolean.class }; assertFalse(ClassUtils.isAssignable(array1, array2)); assertFalse(ClassUtils.isAssignable(null, array2)); assertTrue(ClassUtils.isAssignable(null, array0)); assertTrue(ClassUtils.isAssignable(array0, array0)); assertTrue(ClassUtils.isAssignable(array0, (Class<?>[]) null)); // explicit cast to avoid warning assertTrue(ClassUtils.isAssignable(null, (Class<?>[]) null)); // explicit cast to avoid warning assertFalse(ClassUtils.isAssignable(array1, array1s)); assertTrue(ClassUtils.isAssignable(array1s, array1s)); assertTrue(ClassUtils.isAssignable(array1s, array1)); assertTrue(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers)); assertTrue(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives)); assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1)); assertFalse(ClassUtils.isAssignable(arrayWrappers, array1)); assertTrue(ClassUtils.isAssignable(arrayPrimitives, array2)); assertTrue(ClassUtils.isAssignable(arrayWrappers, array2)); }
@Test public void test_isAssignable_ClassArray_ClassArray_NoAutoboxing() throws Exception { final Class<?>[] array2 = new Class[] {Object.class, Object.class}; final Class<?>[] array1 = new Class[] {Object.class}; final Class<?>[] array1s = new Class[] {String.class}; final Class<?>[] array0 = new Class[] {}; final Class<?>[] arrayPrimitives = { Integer.TYPE, Boolean.TYPE }; final Class<?>[] arrayWrappers = { Integer.class, Boolean.class }; assertFalse(ClassUtils.isAssignable(array1, array2, false)); assertFalse(ClassUtils.isAssignable(null, array2, false)); assertTrue(ClassUtils.isAssignable(null, array0, false)); assertTrue(ClassUtils.isAssignable(array0, array0, false)); assertTrue(ClassUtils.isAssignable(array0, null, false)); assertTrue(ClassUtils.isAssignable((Class[]) null, null, false)); assertFalse(ClassUtils.isAssignable(array1, array1s, false)); assertTrue(ClassUtils.isAssignable(array1s, array1s, false)); assertTrue(ClassUtils.isAssignable(array1s, array1, false)); assertFalse(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, false)); assertFalse(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, false)); assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, false)); assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, false)); assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, false)); assertFalse(ClassUtils.isAssignable(arrayPrimitives, array2, false)); }
assertFalse("byte -> char", ClassUtils.isAssignable(Byte.class, Character.TYPE, true)); assertTrue("byte -> byte", ClassUtils.isAssignable(Byte.class, Byte.TYPE, true)); assertTrue("byte -> short", ClassUtils.isAssignable(Byte.class, Short.TYPE, true)); assertTrue("byte -> int", ClassUtils.isAssignable(Byte.class, Integer.TYPE, true)); assertTrue("byte -> long", ClassUtils.isAssignable(Byte.class, Long.TYPE, true)); assertTrue("byte -> float", ClassUtils.isAssignable(Byte.class, Float.TYPE, true)); assertTrue("byte -> double", ClassUtils.isAssignable(Byte.class, Double.TYPE, true)); assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.class, Boolean.TYPE, true)); assertFalse("short -> char", ClassUtils.isAssignable(Short.class, Character.TYPE, true)); assertFalse("short -> byte", ClassUtils.isAssignable(Short.class, Byte.TYPE, true)); assertTrue("short -> short", ClassUtils.isAssignable(Short.class, Short.TYPE, true)); assertTrue("short -> int", ClassUtils.isAssignable(Short.class, Integer.TYPE, true)); assertTrue("short -> long", ClassUtils.isAssignable(Short.class, Long.TYPE, true)); assertTrue("short -> float", ClassUtils.isAssignable(Short.class, Float.TYPE, true)); assertTrue("short -> double", ClassUtils.isAssignable(Short.class, Double.TYPE, true)); assertFalse("short -> boolean", ClassUtils.isAssignable(Short.class, Boolean.TYPE, true)); assertTrue("char -> char", ClassUtils.isAssignable(Character.class, Character.TYPE, true)); assertFalse("char -> byte", ClassUtils.isAssignable(Character.class, Byte.TYPE, true)); assertFalse("char -> short", ClassUtils.isAssignable(Character.class, Short.TYPE, true)); assertTrue("char -> int", ClassUtils.isAssignable(Character.class, Integer.TYPE, true)); assertTrue("char -> long", ClassUtils.isAssignable(Character.class, Long.TYPE, true)); assertTrue("char -> float", ClassUtils.isAssignable(Character.class, Float.TYPE, true)); assertTrue("char -> double", ClassUtils.isAssignable(Character.class, Double.TYPE, true)); assertFalse("char -> boolean", ClassUtils.isAssignable(Character.class, Boolean.TYPE, true)); assertFalse("int -> char", ClassUtils.isAssignable(Integer.class, Character.TYPE, true)); assertFalse("int -> byte", ClassUtils.isAssignable(Integer.class, Byte.TYPE, true));
assertFalse("byte -> char", ClassUtils.isAssignable(Byte.class, Character.TYPE)); assertTrue("byte -> byte", ClassUtils.isAssignable(Byte.class, Byte.TYPE)); assertTrue("byte -> short", ClassUtils.isAssignable(Byte.class, Short.TYPE)); assertTrue("byte -> int", ClassUtils.isAssignable(Byte.class, Integer.TYPE)); assertTrue("byte -> long", ClassUtils.isAssignable(Byte.class, Long.TYPE)); assertTrue("byte -> float", ClassUtils.isAssignable(Byte.class, Float.TYPE)); assertTrue("byte -> double", ClassUtils.isAssignable(Byte.class, Double.TYPE)); assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.class, Boolean.TYPE)); assertFalse("short -> char", ClassUtils.isAssignable(Short.class, Character.TYPE)); assertFalse("short -> byte", ClassUtils.isAssignable(Short.class, Byte.TYPE)); assertTrue("short -> short", ClassUtils.isAssignable(Short.class, Short.TYPE)); assertTrue("short -> int", ClassUtils.isAssignable(Short.class, Integer.TYPE)); assertTrue("short -> long", ClassUtils.isAssignable(Short.class, Long.TYPE)); assertTrue("short -> float", ClassUtils.isAssignable(Short.class, Float.TYPE)); assertTrue("short -> double", ClassUtils.isAssignable(Short.class, Double.TYPE)); assertFalse("short -> boolean", ClassUtils.isAssignable(Short.class, Boolean.TYPE)); assertTrue("char -> char", ClassUtils.isAssignable(Character.class, Character.TYPE)); assertFalse("char -> byte", ClassUtils.isAssignable(Character.class, Byte.TYPE)); assertFalse("char -> short", ClassUtils.isAssignable(Character.class, Short.TYPE)); assertTrue("char -> int", ClassUtils.isAssignable(Character.class, Integer.TYPE)); assertTrue("char -> long", ClassUtils.isAssignable(Character.class, Long.TYPE)); assertTrue("char -> float", ClassUtils.isAssignable(Character.class, Float.TYPE)); assertTrue("char -> double", ClassUtils.isAssignable(Character.class, Double.TYPE)); assertFalse("char -> boolean", ClassUtils.isAssignable(Character.class, Boolean.TYPE)); assertFalse("int -> char", ClassUtils.isAssignable(Integer.class, Character.TYPE)); assertFalse("int -> byte", ClassUtils.isAssignable(Integer.class, Byte.TYPE));
assertFalse("byte -> char", ClassUtils.isAssignable(Byte.TYPE, Character.TYPE)); assertTrue("byte -> byte", ClassUtils.isAssignable(Byte.TYPE, Byte.TYPE)); assertTrue("byte -> short", ClassUtils.isAssignable(Byte.TYPE, Short.TYPE)); assertTrue("byte -> int", ClassUtils.isAssignable(Byte.TYPE, Integer.TYPE)); assertTrue("byte -> long", ClassUtils.isAssignable(Byte.TYPE, Long.TYPE)); assertTrue("byte -> float", ClassUtils.isAssignable(Byte.TYPE, Float.TYPE)); assertTrue("byte -> double", ClassUtils.isAssignable(Byte.TYPE, Double.TYPE)); assertFalse("byte -> boolean", ClassUtils.isAssignable(Byte.TYPE, Boolean.TYPE)); assertFalse("short -> char", ClassUtils.isAssignable(Short.TYPE, Character.TYPE)); assertFalse("short -> byte", ClassUtils.isAssignable(Short.TYPE, Byte.TYPE)); assertTrue("short -> short", ClassUtils.isAssignable(Short.TYPE, Short.TYPE)); assertTrue("short -> int", ClassUtils.isAssignable(Short.TYPE, Integer.TYPE)); assertTrue("short -> long", ClassUtils.isAssignable(Short.TYPE, Long.TYPE)); assertTrue("short -> float", ClassUtils.isAssignable(Short.TYPE, Float.TYPE)); assertTrue("short -> double", ClassUtils.isAssignable(Short.TYPE, Double.TYPE)); assertFalse("short -> boolean", ClassUtils.isAssignable(Short.TYPE, Boolean.TYPE)); assertTrue("char -> char", ClassUtils.isAssignable(Character.TYPE, Character.TYPE)); assertFalse("char -> byte", ClassUtils.isAssignable(Character.TYPE, Byte.TYPE)); assertFalse("char -> short", ClassUtils.isAssignable(Character.TYPE, Short.TYPE)); assertTrue("char -> int", ClassUtils.isAssignable(Character.TYPE, Integer.TYPE)); assertTrue("char -> long", ClassUtils.isAssignable(Character.TYPE, Long.TYPE)); assertTrue("char -> float", ClassUtils.isAssignable(Character.TYPE, Float.TYPE)); assertTrue("char -> double", ClassUtils.isAssignable(Character.TYPE, Double.TYPE)); assertFalse("char -> boolean", ClassUtils.isAssignable(Character.TYPE, Boolean.TYPE)); assertFalse("int -> char", ClassUtils.isAssignable(Integer.TYPE, Character.TYPE)); assertFalse("int -> byte", ClassUtils.isAssignable(Integer.TYPE, Byte.TYPE));
private void validatedExpectedClass(Class<?> source, Class<?> expected) { if (!ClassUtils.isAssignable(source, expected)) { throw new IllegalArgumentException( String.format("%s cannot be assigned to %s.", source.getName(), expected.getName())); } }
private void validateMethodConsumingSingleAndProducingAPublisher() { Type type = getParameterFromReturnType(method, 0) .orElseThrow(() -> getOutgoingError("Expected a type parameter for the returned Publisher")); production = TypeUtils.isAssignable(type, Message.class) ? Production.STREAM_OF_MESSAGE : Production.STREAM_OF_PAYLOAD; consumption = ClassUtils.isAssignable(method.getParameterTypes()[0], Message.class) ? Consumption.STREAM_OF_MESSAGE : Consumption.STREAM_OF_PAYLOAD; useBuilderTypes = ClassUtils.isAssignable(method.getReturnType(), PublisherBuilder.class); }