Java tutorial
//package com.java2s; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main { /** * When {@code Type} initialized with a value of an object, its fully qualified class name * will be prefixed with this. * * @see {@link ReflectionUtils#getClassName(Type)} */ private static final String TYPE_CLASS_NAME_PREFIX = "class "; private static final String TYPE_INTERFACE_NAME_PREFIX = "interface "; /** * Returns an array of {@code Type} objects representing the actual type * arguments to this object. * If the returned value is null, then this object represents a non-parameterized * object. * * @param object the {@code object} whose type arguments are needed. * @return an array of {@code Type} objects representing the actual type * arguments to this object. * * @see {@link Class#getGenericSuperclass()} * @see {@link ParameterizedType#getActualTypeArguments()} */ public static Type[] getParameterizedTypes(Object object) { Type superclassType = object.getClass().getGenericSuperclass(); if (!ParameterizedType.class.isAssignableFrom(superclassType.getClass())) { return null; } return ((ParameterizedType) superclassType).getActualTypeArguments(); } /** * Returns the {@code Class} object associated with the given {@link Type} * depending on its fully qualified name. * * @param type the {@code Type} whose {@code Class} is needed. * @return the {@code Class} object for the class with the specified name. * * @throws ClassNotFoundException if the class cannot be located. * * @see {@link ReflectionUtils#getClassName(Type)} */ public static Class<?> getClass(Type type) throws ClassNotFoundException { String className = getClassName(type); if (className == null || className.isEmpty()) { return null; } return Class.forName(className); } /** * {@link Type#toString()} value is the fully qualified class name prefixed * with {@link ReflectionUtils#TYPE_NAME_PREFIX}. This method will substring it, for it to be eligible * for {@link Class#forName(String)}. * * @param type the {@code Type} value whose class name is needed. * @return {@code String} class name of the invoked {@code type}. * * @see {@link ReflectionUtils#getClass()} */ public static String getClassName(Type type) { if (type == null) { return ""; } String className = type.toString(); if (className.startsWith(TYPE_CLASS_NAME_PREFIX)) { className = className.substring(TYPE_CLASS_NAME_PREFIX.length()); } else if (className.startsWith(TYPE_INTERFACE_NAME_PREFIX)) { className = className.substring(TYPE_INTERFACE_NAME_PREFIX.length()); } return className; } }