泛型方法返回类型
如果你获得了java.lang.reflect.Method对象,那么你就可以获取到这个方法的泛型返回类型信息。如果方法是在一个被参数化类型之中(如T test())那么你无法获取他的具体类型,但是如果方法返回一个泛型类(如List test())那么你就可以获得这个泛型类的具体参数化类型。
泛型变量类型
同样可以通过反射来访问公有(Public)变量的泛型类型,无论这个变量是一个类的静态成员变量或是实例成员变量。你可以在“Java Reflection: Fields”中阅读到有关如何获取Field对象的相关内容。这是之前的一个例子,一个定义了一个名为list的成员变量的类。
public class ReflectTModel {
public List<String> list = new ArrayList<String>();
public List<String> getList(){
return list;
}
}
public class ReflectTDemo {
public static void main(String [] args) throws Exception {
try {
//通过全限定名找到class
Class t = Class.forName("com.honjane.demo.javademo.ReflectTModel");
//获得class直接父类类型
System.out.println(t.getGenericSuperclass());
//------------------------------------------------------
//泛型方法返回类型:
Method method = t.getMethod("getList");
//目标方法返回类型,(不局限于修饰符)
Type type = method.getGenericReturnType();
if(type instanceof ParameterizedType){
//ParameterizedType 模板参数的类型
ParameterizedType pType = (ParameterizedType) type;
System.out.println("method ParameterizedType:"+pType);
// 返回参数数组
Type[] types = pType.getActualTypeArguments();
for (Type typeArgument : types){
//参数类型
Class _class = (Class)typeArgument;
System.out.println("typeArgument:"+_class);
}
}
//------------------------------------------------------
System.out.println("------------------------------------");
//泛型属性返回类型:
Field field = t.getField("list");
//目标属性的类型,(不局限于修饰符)
Type gType = field.getGenericType();
if(gType instanceof ParameterizedType){
//ParameterizedType 模板参数的类型
ParameterizedType parameterizedType = (ParameterizedType)gType;
System.out.println("Field ParameterizedType:"+parameterizedType);
// 返回参数数组
Type[] agrTypes = parameterizedType.getActualTypeArguments();
//运行时类型
Type agrType1 = parameterizedType.getRawType();
System.out.println("运行时类型agrType1:"+agrType1);
for (Type type1: agrTypes){
//参数类型
Class _class = (Class)type1;
System.out.println("agrType:"+_class);
}
}
}catch (Exception e){
}
}
}
结果:
class java.lang.Object
method ParameterizedType:java.util.List<java.lang.String>
typeArgument:class java.lang.String
------------------------------------
Field ParameterizedType:java.util.List<java.lang.String>
运行时类型agrType1:interface java.util.List
agrType:class java.lang.String