private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass) { return getGenericInterfaces(cls, expectedClass, Object.class); } private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass,
private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass) { if (Object.class == cls) { return new Type[]{}; } if (expectedClass != null) { Type genericSuperType = cls.getGenericSuperclass(); if (genericSuperType instanceof ParameterizedType) { Class<?> actualType = InjectionUtils.getActualType(genericSuperType); if (actualType != null && actualType.isAssignableFrom(expectedClass)) { return new Type[]{genericSuperType}; } else if (expectedClass.isAssignableFrom(actualType)) { return new Type[]{}; } } } Type[] types = cls.getGenericInterfaces(); if (types.length > 0) { return types; } return getGenericInterfaces(cls.getSuperclass(), expectedClass); }
private static Type[] getGenericInterfaces(Class<?> cls, Class<?> expectedClass, Class<?> commonBaseCls) { if (Object.class == cls) { return new Type[]{}; } if (expectedClass != null) { Type genericSuperType = cls.getGenericSuperclass(); if (genericSuperType instanceof ParameterizedType) { Class<?> actualType = InjectionUtils.getActualType(genericSuperType); if (actualType != null && actualType.isAssignableFrom(expectedClass)) { return new Type[]{genericSuperType}; } else if (commonBaseCls != null && commonBaseCls != Object.class && commonBaseCls.isAssignableFrom(expectedClass) && commonBaseCls.isAssignableFrom(actualType) || expectedClass.isAssignableFrom(actualType)) { return new Type[]{}; } } } Type[] types = cls.getGenericInterfaces(); if (types.length > 0) { return types; } return getGenericInterfaces(cls.getSuperclass(), expectedClass, commonBaseCls); }
protected static int compareClasses(Class<?> expectedCls, Object o1, Object o2) { Class<?> cl1 = ClassHelper.getRealClass(o1); Class<?> cl2 = ClassHelper.getRealClass(o2); Type[] types1 = getGenericInterfaces(cl1, expectedCls); Type[] types2 = getGenericInterfaces(cl2, expectedCls); if (types1.length == 0 && types2.length == 0) { return 0; } else if (types1.length == 0 && types2.length > 0) { return 1; } else if (types1.length > 0 && types2.length == 0) { return -1; } Class<?> realClass1 = InjectionUtils.getActualType(types1[0]); Class<?> realClass2 = InjectionUtils.getActualType(types2[0]); if (realClass1 == realClass2) { return 0; } if (realClass1.isAssignableFrom(realClass2)) { // subclass should go first return 1; } return -1; }
protected static int compareClasses(Class<?> expectedCls, Object o1, Object o2) { Class<?> cl1 = ClassHelper.getRealClass(o1); Class<?> cl2 = ClassHelper.getRealClass(o2); Type[] types1 = getGenericInterfaces(cl1, expectedCls); Type[] types2 = getGenericInterfaces(cl2, expectedCls); if (types1.length == 0 && types2.length == 0) { return 0; } else if (types1.length == 0 && types2.length > 0) { return 1; } else if (types1.length > 0 && types2.length == 0) { return -1; } Class<?> realClass1 = InjectionUtils.getActualType(types1[0]); Class<?> realClass2 = InjectionUtils.getActualType(types2[0]); if (realClass1 == realClass2) { return 0; } if (realClass1.isAssignableFrom(realClass2)) { // subclass should go first return 1; } return -1; }
types = new Type[]{mapperClass}; } else { types = getGenericInterfaces(mapperClass, expectedType, commonBaseClass);
types = new Type[]{mapperClass}; } else { types = getGenericInterfaces(mapperClass, expectedType);