本文最后更新于:星期四, 六月 18日 2020, 9:01 上午

#####通过泛型和反射避免强制类型转换:
下面这个代码是没问题的。

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<Date> clazz= (Class<Date>) Class.forName("java.util.Date");
        Date date=AFactory.getInstance(clazz);
        String string=AFactory.getInstance(clazz);

    }
}
class AFactory{
    public static<T> T getInstance(Class<T> 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<Person> 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<Person> clazz=Person.class;
        Field field=clazz.getDeclaredField("map");
        Class<?> a=field.getType();
        System.out.println(a);
    }
}
class Person{
    private Map<String,Integer> map;
}

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

可以如下:

public class MainTest {
    public static void main(String args[]) throws Exception {
        Class<Person> 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<tArgs.length;i++){
                System.out.println("第"+i+"个泛型类型是"+tArgs[i]);
            }
        }else {
            System.out.println("获取泛型类型出错");
        }
    }
}
class Person{
    private Map<Integer,String> map;
}

打印:

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