Java 反射技术:(四)反射操作泛型

反射操作泛型

    • 1.泛型
    • 2.Java 新增的数据类型

1.泛型

Java 中的泛型仅仅是给编译器 javac 使用的,确保数据的安全性和免去强制类型转换的麻烦,但是一旦编译完成,所有与泛型有关的类型全部擦除。
使用泛型直接读取泛型,是读取不到的,因为反射是操作加载以后的类的。
测试代码:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Text{
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<String> alist=new ArrayList<String>();
        Class c=alist.getClass();//得到Class对象
        Method m=c.getDeclaredMethod("add", Object.class);
        //执行添加方法
        m.invoke(alist, 123);
        //输出集合中元素的个数
        System.out.println(alist.size());
    }
}

运行结果:
泛型

2.Java 新增的数据类型

为了通过反射操作这些类型以迎合实际开发的需要

序号 类型 描述
1 ParameterizedType 表示一种参数化的类型 , 比如 Collection,可以获取 String信息
2 GenericArrayType 泛型数组类型
3 TypeVariable 各种类型变量的公共父接口
4 WildcardType 代表一种通配符类型表达式,比如? extends Number,? super Integer (Wildcard 是一个单词,就是通配符)

测试代码:

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

public class Text{
    public static void main(String[] args) throws NoSuchMethodException {
        //获取test01方法的泛型参数信息
        Class c=Text.class;
        Method test01=c.getMethod("test01", Map.class,List.class,String.class);
        //获取带泛型参数的类型
        Type [] tytes=test01.getGenericParameterTypes();
        System.out.println(tytes.length);
        for (Type type : tytes) {
            if (type instanceof ParameterizedType) {
                Type[] genericType= ((ParameterizedType) type).getActualTypeArguments();
                //遍历每一个泛型参数中泛型的类型
                for (Type genType : genericType) {
                    System.out.println("泛型类型:"+genType);
                }
                System.out.println("\n----------------------");
            }
        }
        System.out.println("\n-----------------------\n");
        //获取test02方法返回值的泛型信息
        Method m2=c.getMethod("test02", null);
        Type returnType=m2.getGenericReturnType();
        //判断是否带有泛型
        if(returnType instanceof ParameterizedType){
            Type [] types=((ParameterizedType) returnType).getActualTypeArguments();
            for (Type type : types) {
                System.out.println("返回值的泛型类型:"+type);
            }
        }
        System.out.println("\n--------------------------\n");
        Method m3=c.getMethod("test03", null);
        Type returnType3=m3.getGenericReturnType();
        System.out.println(returnType3 instanceof ParameterizedType);
    }
    public void test01(Map<String,Person> map,List<Person> list,String s){
        System.out.println("Text.test01()");
    }
    public Map<Integer,Person> test02(){
        System.out.println("Text.test02()");
        return null;
    }
    public String test03(){
        System.out.println("Text.test03()");
        return null;
    }
}

运行结果:
Java 反射技术:(四)反射操作泛型_第1张图片

你可能感兴趣的:(Java基础深化与提高)