引言

上一篇文章,我们介绍了反射体系中很重要的一个接口Type及其子接口,这些子接口(Class是实现类)是Java语言中某种类型在JDK中的映射。这篇文章,我们来看Class实现的另一个重要接口:GenericDeclaration。这个相对Type接口就要简单很多了,而且这个接口跟Type的子接口TypeVariable还息息相关。

接口定义

GenericDeclaration接口的定义如下:

  1. /**
  2. * A common interface for all entities that declare type variables.
  3. *
  4. * @since 1.5
  5. */
  6. public interface GenericDeclaration extends AnnotatedElement {}

GenericDeclaration是所有可以声明类型变量的实体的公共接口,类型变量我们已经在Type接口中详细讲解过了,TypeVariable接口就代表类型变量。泛型类、泛型接口、泛型方法和泛型构造方法中都可以有类型变量。
我这里还是给出之前的一个例子:

  1. public class TypeVariableTest1<T> {
  2. }
  3. public class TypeVariableTest2<E extends SimpleObject> {
  4. }

其中,T和E就是典型的类型变量。
既然泛型类、泛型接口、泛型方法和泛型构造方法中都可以有类型变量,那么GenericDeclaration的实现类也就是这几种,如下图所示:
image.png
其中,Executable是Constructor和Method的公共父类。注意GenericDeclaration也实现了AnnotatedElement接口,因为不管是泛型类、泛型方法还是泛型构造方法,都是可被注解的元素。再看GenericDeclaration的方法:

  1. public TypeVariable<?>[] getTypeParameters();

只有一个,用来返回这个泛型类、泛型接口、泛型方法或者泛型构造方法的类型变量。我们注意看返回值,就是TypeVariable的数组。我们可以看一个例子:

  1. public class GenericHolder2<T extends SimpleObject,E> {
  2. private T t;
  3. private E e;
  4. public static void main(String[] args) {
  5. GenericHolder2<SimpleObject,String> genericHolder2 = new GenericHolder2<>();
  6. TypeVariable<? extends Class<? extends GenericHolder2>>[] typeParameters = genericHolder2.getClass().getTypeParameters();
  7. System.out.println(Arrays.toString(typeParameters));
  8. }
  9. }

Class实现了GenericDeclaration接口并重写了getTypeParameters方法,输出如下:

  1. [T, E]

可以看到只有标识符。
当然,拿到了类、接口、方法或者构造方法的类型变量之后,我们就能使用TypeVariable的方法做一些操作了,例如获取类型变量的边界等,TypeVariable的使用这里不再详细介绍,可以参考这里

小结

GenericDeclaration是对java语言中可声明类型变量的元素(类、接口、方法和构造方法)的一种映射,通过getTypeParameter()方法我们能拿到这些元素的类型变量,然后做对应的操作。