package core.framework.impl.reflect;
import core.framework.api.util.Exceptions;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* @author neo
*/
public final class GenericTypes {
public static Class<?> rawClass(Type type) {
if (type instanceof Class) {
return (Class<?>) type;
} else if (type instanceof ParameterizedType) {
return (Class<?>) ((ParameterizedType) type).getRawType();
} else {
throw Exceptions.error("unsupported type, type={}", type);
}
}
public static boolean isList(Type type) {
return List.class.isAssignableFrom(rawClass(type));
}
public static boolean isGenericList(Type type) {
if (type instanceof ParameterizedType) {
Class<?> rawClass = (Class<?>) ((ParameterizedType) type).getRawType();
return List.class.isAssignableFrom(rawClass)
&& ((ParameterizedType) type).getActualTypeArguments()[0] instanceof Class;
}
return false;
}
public static Class<?> listValueClass(Type type) {
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
}
public static boolean isOptional(Type type) {
return Optional.class.isAssignableFrom(rawClass(type));
}
public static boolean isGenericOptional(Type type) {
if (type instanceof ParameterizedType) {
Class<?> rawClass = (Class<?>) ((ParameterizedType) type).getRawType();
return Optional.class.isAssignableFrom(rawClass)
&& ((ParameterizedType) type).getActualTypeArguments()[0] instanceof Class;
}
return false;
}
public static Class<?> optionalValueClass(Type type) {
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
}
public static boolean isMap(Type type) {
return Map.class.isAssignableFrom(rawClass(type));
}
public static boolean isGenericStringMap(Type type) {
if (type instanceof ParameterizedType) {
Type keyType = ((ParameterizedType) type).getActualTypeArguments()[0];
if (!(keyType instanceof Class)) return false;
Class<?> keyClass = (Class<?>) keyType;
return String.class.equals(keyClass)
&& ((ParameterizedType) type).getActualTypeArguments()[1] instanceof Class;
}
return false;
}
public static Class<?> mapValueClass(Type type) {
return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[1];
}
}