一、前言
关于Class类中定义反向泛型的java.lang.reflect.Type接口(如下图),其中对于四种不同java.lang.reflect.ParameterizedType(参数化类型)、java.lang.reflect.GenericArrayType(数组类型)、java.lang.reflect.WildcardType(通配符类型)、java.lang.reflect.TypeVariable(类型变量)接口场景(如下图)
二、代码示例
1.BaseType基类
package test;@b@@b@import java.lang.reflect.GenericArrayType;@b@import java.lang.reflect.ParameterizedType;@b@import java.lang.reflect.Type;@b@ @b@public class BaseType<T1, T2> { @b@ @b@ class A {} @b@ class B extends A {} @b@ @b@ protected BaseType (){ @b@ @b@ Type type = getClass().getGenericSuperclass(); @b@ @b@ System.out.println("1.Type====" + type); @b@ System.out.println("2.ParameterizedType====" + (ParameterizedType) type); @b@ System.out.println(">2.1.getRawType====" + ((ParameterizedType) type).getRawType()); @b@ Type trueType = ((ParameterizedType)type).getActualTypeArguments()[1]; @b@ if (trueType instanceof GenericArrayType) {@b@ Type type6=((GenericArrayType) trueType).getGenericComponentType();@b@ System.out.println(">2.2.getGenericComponentType====" + type6); @b@ } @b@ System.out.println(">2.3.getComponentType====" + new String[]{}.getClass().getComponentType());@b@ @b@ System.out.println("3.getActualTypeArguments[1]====" + trueType); @b@ type = new B().getClass().getGenericSuperclass(); @b@ System.out.println(">3.1.getActualTypeArguments[all]====" + ((ParameterizedType)type).getActualTypeArguments().length); @b@ @b@ } @b@}
2.SubTypeTst子类
package test;@b@@b@import java.io.Serializable;@b@import java.lang.reflect.Type;@b@@b@public class SubTypeTst extends BaseType<Object, String[]> implements Serializable { @b@ @b@ public static void main(String[] args){ @b@ @b@ Type[] ts = SubTypeTst.class.getGenericInterfaces(); @b@ for (Type t:ts) { @b@ System.out.println("0.getGenericInterfaces===="+t); @b@ }@b@ new SubTypeTst(); @b@ } @b@}
控制台输出结果如下
0.getGenericInterfaces====interface java.io.Serializable@b@1.Type====test.BaseType<java.lang.Object, java.lang.String[]>@b@2.ParameterizedType====test.BaseType<java.lang.Object, java.lang.String[]>@b@>2.1.getRawType====class test.BaseType@b@>2.2.getGenericComponentType====class java.lang.String@b@>2.3.getComponentType====class java.lang.String@b@3.getActualTypeArguments[1]====java.lang.String[]@b@>3.1.getActualTypeArguments[all]====0