反射允许你在运行时分析任意的对象。如果对象是泛型类的实例,关于泛型类型参数则得不到太多的信息,因为他们会被檫除。
一、泛型Class类
现在,Class类是泛型的。例如,String.class实际上是一个Class类的对象(事实上,是唯一的对象)。
类型参数十分有用,这是因为它允许Class方法的返回值类型更加具有针对性。下面Class中的方法就使用了类型参数:
T newInstance();
T cast(Object obj);
T[] getEnumConstants();
Class<? super T> getSuperclass();
Constructor getConstructor(Class… parameterTypes);
Constructor getDeclaredConstructor(Class… paramterTypes);
newInstance 方法返回一个实例,这个实例所属的类由默认的构造器获得。他的返回类型目前被声明为T,其类型与Class描述的类相同,这样就免除了类型转换。如果给定的类型确实是T的一个子类型,cast方法就会返回一个现在声明为类型T的对象,否则,抛出一个BadCastException异常。如果这个类不是enum类或是类型T的枚举值的数组,getEnumConstants方法将返回null。最后getConstructor与getdeclaredConstructor方法返回一个Constructor对象。Constructor类也已经变成泛型,以便newInstance方法有一个正确的返回类型。
- T newInstance()
返回无参数构造的一个新实例。 - T cast(Object obj)
如果obj为null或有可能转换成类型T,则返回obj否则抛出BadCastException异常。 - T[] getEnumConstants()
如果T是枚举类型,则返回所有值组成的数组,否则返回null - Class<? super T> getSuperclass();
返回这个类的超类。如果T不是一个类或是Object类,则返回null - Constructor getConstructor(Class… parameterTypes);
Constructor getDeclaredConstructor(Class… paramterTypes);
获得公有的构造器,或带有给定参数的构造器 - T newInstance(Object… parameters)
返回用指定参数构造的新实例。
二、使用Class参数进行类型匹配
有时,匹配泛型方法中的Class参数名的类型变量很有实用价值。下面是一个标准的实例:
Employee.class是类型Class的一个对象。makePair方法的参数类型T同Employee匹配,并且编译器可以推断出这个方法将会返回一个Pair。