fun.fengwk.convention4j.springboot.starter.cache.registry.CacheInitializationUtils Maven / Gradle / Ivy
The newest version!
package fun.fengwk.convention4j.springboot.starter.cache.registry;
import fun.fengwk.convention4j.common.lang.ClassUtils;
import fun.fengwk.convention4j.common.reflect.GenericArrayTypeImpl;
import fun.fengwk.convention4j.common.reflect.ParameterizedTypeImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ResolvableType;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* @author fengwk
*/
@Slf4j
public class CacheInitializationUtils {
private CacheInitializationUtils() {}
public static boolean isReturnTypeOrMultiReturnType(Type returnType, Class declaringClass, Class targetClass) {
returnType = resolveVariableType(returnType, declaringClass, Collections.emptyMap());
ResolvableType rt = ResolvableType.forType(returnType);
Class returnClass = rt.resolve();
if (returnClass == null) {
return false;
}
if (ClassUtils.boxedIfPrimitiveType(returnClass) == ClassUtils.boxedIfPrimitiveType(targetClass)) {
return true;
}
if (Iterable.class.isAssignableFrom(returnClass)
&& ClassUtils.boxedIfPrimitiveType(rt.as(Iterable.class).getGeneric(0).resolve()) == ClassUtils.boxedIfPrimitiveType(targetClass)) {
return true;
}
if (returnClass.isArray()
&& returnClass.getComponentType().isAssignableFrom(targetClass)) {
return true;
}
return false;
}
public static boolean isParameterTypeOrMultiParameterType(Type parameterType, Class declaringClass, Class classType) {
parameterType = resolveVariableType(parameterType, declaringClass, Collections.emptyMap());
ResolvableType rt = ResolvableType.forType(parameterType);
Class parameterClass = rt.resolve();
if (parameterClass == null) {
return false;
}
if (ClassUtils.boxedIfPrimitiveType(parameterClass) == ClassUtils.boxedIfPrimitiveType(classType)) {
return true;
}
if (Iterable.class.isAssignableFrom(parameterClass)
&& ClassUtils.boxedIfPrimitiveType(rt.as(Iterable.class).getGeneric(0).resolve()) == ClassUtils.boxedIfPrimitiveType(classType)) {
return true;
}
if (parameterClass.isArray()
&& ClassUtils.boxedIfPrimitiveType(classType).isAssignableFrom(ClassUtils.boxedIfPrimitiveType(parameterClass.getComponentType()))) {
return true;
}
return false;
}
/**
* @see #isParameterTypeOrMultiParameterType(Type, Class, Class)
* @param parameterType
* @param classType
* @return
*/
public static Function