反射泛型

Posted 龘驫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射泛型相关的知识,希望对你有一定的参考价值。

对泛型进行反射:

package com.zby;

import java.io.Closeable;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Arrays;
import java.util.List;

/*K,V,N是TypeVariable;字段调用getGenericType()方法,list1返回Class,list2、list3、list4、list5返回ParameterizedType,list6返回GenericArrayType;
*list2的ParameterizedType调用getActualTypeArguments返回的是TypeVariable,list3,list4,list5调用getActualTypeArguments返回的是WildcardType,
*list6调用getGenericComponentType()返回的是ParameterizedType.
*
*/

public class TestType<K extends InputStream & Closeable, V extends K> {
    public K k;
    @SuppressWarnings("rawtypes")
    public List list1;
    public List<K> list2;
    public List<?> list3;
    public List<? extends K> list4;
    public List<? super V> list5;
    public List<?>[] list6;

    public <N extends Number> N testV(List<? extends Number> list5, List<? super Number> list6) {
        return null;
    }


    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        TypeVariable<Class<TestType>>[] typeParameters = TestType.class.getTypeParameters();
        System.out.println("类的泛型:" + Arrays.toString(typeParameters));
        for (TypeVariable<Class<TestType>> typeVariable : typeParameters) {
            System.out.print("泛型【" + typeVariable + "】:");
            String name = typeVariable.getName();
            System.out.print("泛型名称=" + name);
            Class<TestType> genericDeclaration = typeVariable.getGenericDeclaration();
            System.out.print(",泛型定义的类=" + genericDeclaration + ",");
            Type[] bounds = typeVariable.getBounds();
            for (Type type : bounds) {
                // 边界如果是确定的类型,type就会封装成Class类型,如果还是一个泛型,type就会封装成TypeVariable对象
                System.out.print("上边界Type类型=" + type.getClass().getName() + ",实际类型=");
                if (type instanceof Class) {
                    Class<?> clazz = (Class) type;
                    System.out.print(clazz);
                }
                if (type instanceof TypeVariable<?>) {
                    TypeVariable<?> typeVariable2 = (TypeVariable<?>) type;
                    System.out.print(typeVariable2);
                }
            }
            System.out.println();
        }
        System.out.println();

        Field[] fields = TestType.class.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("字段【" + field.getName() + "】:");
            Type type = field.getGenericType();
            System.out.print("字段Type类型为=" + type.getClass().getName() + ",字段实际类型=");
            if (type instanceof Class) {
                Class<?> clazz = (Class) type;
                System.out.print(clazz);
            }
            if (type instanceof TypeVariable<?>) {
                TypeVariable<?> typeVariable2 = (TypeVariable<?>) type;
                System.out.print(typeVariable2);
            }
            if (type instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) type;
                System.out.print(parameterizedType);
                Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
                for (Type type2 : actualTypeArguments) {
                    if (type2 instanceof WildcardType) {
                        WildcardType wildcardType = (WildcardType) type2;
                        System.out.print(",参数化类型的Type类型为=" + type2.getClass().getName() + ",上边界为="
                                + wildcardType.getUpperBounds()[0] + ",下边界为=" + wildcardType.getLowerBounds().length
                                + ",实际类型=" + type2);
                    }
                    System.out.print(",参数化类型的Type类型为=" + type2.getClass().getName() + ",实际类型=" + type2);
                }
            }
            if (type instanceof GenericArrayType) {
                GenericArrayType genericArrayType = (GenericArrayType) type;
                System.out.println(genericArrayType.getGenericComponentType().getClass().getName());
            }
            System.out.println();
        }
        System.out.println();

        Method[] methods = TestType.class.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("-" + method.getGenericReturnType().getClass().getName());
        }
    }
}
类的泛型:[K, V]
泛型【K】:泛型名称=K,泛型定义的类=class com.zby.TestType,上边界Type类型=java.lang.Class,实际类型=class java.io.InputStream上边界Type类型=java.lang.Class,实际类型=interface java.io.Closeable
泛型【V】:泛型名称=V,泛型定义的类=class com.zby.TestType,上边界Type类型=sun.reflect.generics.reflectiveObjects.TypeVariableImpl,实际类型=K

字段【k】:字段Type类型为=sun.reflect.generics.reflectiveObjects.TypeVariableImpl,字段实际类型=K
字段【list1】:字段Type类型为=java.lang.Class,字段实际类型=interface java.util.List
字段【list2】:字段Type类型为=sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl,字段实际类型=java.util.List<K>,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.TypeVariableImpl,实际类型=K
字段【list3】:字段Type类型为=sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl,字段实际类型=java.util.List<?>,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,上边界为=class java.lang.Object,下边界为=0,实际类型=?,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,实际类型=?
字段【list4】:字段Type类型为=sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl,字段实际类型=java.util.List<? extends K>,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,上边界为=K,下边界为=0,实际类型=? extends K,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,实际类型=? extends K
字段【list5】:字段Type类型为=sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl,字段实际类型=java.util.List<? super V>,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,上边界为=class java.lang.Object,下边界为=1,实际类型=? super V,参数化类型的Type类型为=sun.reflect.generics.reflectiveObjects.WildcardTypeImpl,实际类型=? super V
字段【list6】:字段Type类型为=sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl,字段实际类型=sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl


-java.lang.Class
-sun.reflect.generics.reflectiveObjects.TypeVariableImpl

 泛型相关的反射开始理解有点绕,但是结合源码,配合手动尝试,半天就能理解!

以上是关于反射泛型的主要内容,如果未能解决你的问题,请参考以下文章

反射获取泛型信息

如何反射获取List<T> 中泛型的类型

使用反射和泛型简化Golang查询数据库代码的方案

javajav 通过 反射 获取 泛型信息

Java泛型反射机制

Java反射的理解-- 通过反射了解集合泛型的本质