Called to properly resolve return type of root finder or inherited finder method. - Java Reflection

Java examples for Reflection:Enum

Description

Called to properly resolve return type of root finder or inherited finder method.

Demo Code


//package com.java2s;
import java.lang.reflect.*;

import java.util.Map;

public class Main {
    /**// w w w  .  j  a  v a2s  .  co  m
     * Called to properly resolve return type of root finder or inherited finder method.
     * Supposed to return enough type info to detect return type (collection, array or plain object).
     *
     * @param method   method to analyze
     * @param generics generics resolution map for method class (will be null for root)
     * @return return type class
     */
    public static Class<?> getReturnClass(final Method method,
            final Map<String, Type> generics) {
        final Type returnType = method.getGenericReturnType();
        return resolveClass(returnType, generics);
    }

    /**
     * Resolves top class for provided type (for example, for generified classes like {@code List<T>} it
     * returns base type List).
     *
     * @param type     type to resolve
     * @param generics root class generics mapping
     * @return resolved class
     */
    public static Class<?> resolveClass(final Type type,
            final Map<String, Type> generics) {
        Class<?> res;
        if (type instanceof Class) {
            res = (Class) type;
        } else if (type instanceof ParameterizedType) {
            res = resolveClass(((ParameterizedType) type).getRawType(),
                    generics);
        } else if (type instanceof TypeVariable) {
            res = resolveClass(
                    generics.get(((TypeVariable) type).getName()), generics);
        } else if (type instanceof WildcardType) {
            final Type[] upperBounds = ((WildcardType) type)
                    .getUpperBounds();
            res = resolveClass(upperBounds[0], generics);
        } else {
            final Class arrayType = resolveClass(
                    ((GenericArrayType) type).getGenericComponentType(),
                    generics);
            try {
                // returning complete array class with resolved type
                if (arrayType.isArray()) {
                    res = Class.forName("[" + arrayType.getName());
                } else {
                    res = Class.forName("[L" + arrayType.getName() + ";");
                }
            } catch (ClassNotFoundException e) {
                throw new IllegalStateException(
                        "Failed to create array class", e);
            }
        }
        return res;
    }
}

Related Tutorials