通过反射查看泛型信息

通过泛型和反射避免强制类型转换:

下面这个代码是没问题的。

Class clazz=Class.forName("java.util.Date");
Date date= (Date) clazz.newInstance();

但是这样也没问题,编译器不会报错,但是run肯定会报错。

String string= (String) clazz.newInstance();

结合泛型反射可以避免强制类型转换,让编译器帮我们检查:

@SuppressWarnings(value = "unchecked")
public class MainTest {
    public static void main(String args[]) throws Exception {
        Class clazz= (Class) Class.forName("java.util.Date");
        Date date=AFactory.getInstance(clazz);
        String string=AFactory.getInstance(clazz);

    }
}
class AFactory{
    public static T getInstance(Class clazz){
        try {
            return clazz.newInstance();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("wrong");
            return null;
        }
    }
}

编译器不允许编译通过。

通过反射查看泛型信息。

获取普通的成员变量的信息:

public class MainTest {
    public static void main(String args[]) throws Exception {
        Class clazz=Person.class;
        Field field=clazz.getDeclaredField("name");
        Class a=field.getType();
        System.out.println(a);
    }
}
class Person{
    private String name;
}

打印:class java.lang.String
按上述方法获取泛型信息:

public class MainTest {
    public static void main(String args[]) throws Exception {
        Class clazz=Person.class;
        Field field=clazz.getDeclaredField("map");
        Class a=field.getType();
        System.out.println(a);
    }
}
class Person{
    private Map map;
}

打印:java.util.Map,获取不到泛型String和Interger的信息。

可以如下:

public class MainTest {
    public static void main(String args[]) throws Exception {
        Class clazz=Person.class;
        Field field=clazz.getDeclaredField("map");
        Type type=field.getGenericType();
        System.out.println(type.getTypeName());

        if (type instanceof ParameterizedType){
            ParameterizedType parameterizedType= (ParameterizedType) type;
            Type rType=parameterizedType.getRawType();
            System.out.println("原始类型:"+rType);
            Type[] tArgs=parameterizedType.getActualTypeArguments();
            for (int i =0;i map;
}

打印:

java.util.Map
原始类型:interface java.util.Map
第0个泛型类型是class java.lang.Integer
第1个泛型类型是class java.lang.String

你可能感兴趣的:(通过反射查看泛型信息)