集册 Java实例教程 解析参数化类型

解析参数化类型

欢马劈雪     最近更新时间:2020-01-02 10:19:05

428
解析参数化类型

/*

 * Copyright 2007-2011 Hidekatsu Izuno

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 

 * either express or implied. See the License for the specific language

 * governing permissions and limitations under the License.

 */

//package com.nowjava;
/**
 * 时代Java 提 供 
**/


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;


public class Main {

    public static ParameterizedType resolveParameterizedType(Type t,//N o w J a v a . c o m - 时代Java

            Class<?> baseClass) {

        Class<?> raw = getRawType(t);


        if (t instanceof ParameterizedType

                && baseClass.isAssignableFrom(raw)) {

            return (ParameterizedType) t;

        }


        ParameterizedType pt = null;

        if (raw.getSuperclass() != null

                && raw.getSuperclass() != Object.class) {

            pt = resolveParameterizedType(raw.getGenericSuperclass(),

                    baseClass);

            if (pt != null)

                return pt;

        }

        if (!raw.isInterface()) {

            for (Type ifs : raw.getGenericInterfaces()) {

                pt = resolveParameterizedType(ifs, baseClass);

                if (pt != null)

                    return pt;

            }

        }

        return null;

    }


    public static Class<?> getRawType(Type t) {

        if (t instanceof Class<?>) {

            return (Class<?>) t;

        } else if (t instanceof ParameterizedType) {

            return (Class<?>) ((ParameterizedType) t).getRawType();

        } else if (t instanceof GenericArrayType) {

            Class<?> cls = null;

            try {

                cls = Array

                        .newInstance(

                                getRawType(((GenericArrayType) t)

                                        .getGenericComponentType()),

                                0).getClass();

            } catch (Exception e) {

                
展开阅读全文