All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.antelopeframework.util.GenericUtil Maven / Gradle / Ivy

The newest version!
package com.github.antelopeframework.util;

import java.lang.reflect.Array;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.WildcardType;
import java.util.List;

/**
 * @see jp.sf.amateras.mirage.util.GenericUtil 
 */
public abstract class GenericUtil {

	private GenericUtil() { }

	public static boolean isTypeOf(final Type type, final Class clazz) {
		if (Class.class.isInstance(type)) {
			return clazz.isAssignableFrom(Class.class.cast(type));
		}
		
		if (ParameterizedType.class.isInstance(type)) {
			final ParameterizedType parameterizedType = ParameterizedType.class.cast(type);
			return isTypeOf(parameterizedType.getRawType(), clazz);
		}
		
		return false;
	}

	public static Class getRawClass(final Type type) {
		if (Class.class.isInstance(type)) {
			return Class.class.cast(type);
		}
		
		if (ParameterizedType.class.isInstance(type)) {
			final ParameterizedType parameterizedType = ParameterizedType.class.cast(type);
			return getRawClass(parameterizedType.getRawType());
		}
		
		if (WildcardType.class.isInstance(type)) {
			final WildcardType wildcardType = WildcardType.class.cast(type);
			final Type[] types = wildcardType.getUpperBounds();
			return getRawClass(types[0]);
		}
		
		if (GenericArrayType.class.isInstance(type)) {
			final GenericArrayType genericArrayType = GenericArrayType.class.cast(type);
			final Class rawClass = getRawClass(genericArrayType.getGenericComponentType());
			return Array.newInstance(rawClass, 0).getClass();
		}
		
		return null;
	}

	public static Type[] getGenericParameter(final Type type) {
		if (ParameterizedType.class.isInstance(type)) {
			return ParameterizedType.class.cast(type).getActualTypeArguments();
		}
		
		if (GenericArrayType.class.isInstance(type)) {
			return getGenericParameter(GenericArrayType.class.cast(type).getGenericComponentType());
		}
		
		return null;
	}

	public static Type getGenericParameter(final Type type, final int index) {
		if (!ParameterizedType.class.isInstance(type)) {
			return null;
		}
		
		final Type[] genericParameter = getGenericParameter(type);
		if (genericParameter == null) {
			return null;
		}
		
		return genericParameter[index];
	}

	public static Type getElementTypeOfList(final Type type) {
		if (!isTypeOf(type, List.class)) {
			return null;
		}
		
		return getGenericParameter(type, 0);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy