Type

此接口是Java所有类型(types)的共同的父接口

包括原始类型(raw types),参数类型(parameterized types),数组类型(array types),类型变量(type variables),基本类型(primitive types)

此接口就定义了一个方法,返回一个描述此类型的字符串,包括任何类型参数(type parameters)的信息

默认实例是调用toString()方法

  • getTypeName()

UML类图

raw type(原始类型)

我们知道虚拟机没有泛型类型对象--所有对象都属于普通类。

无论何时定义一个泛型类,都自动提供一个相应的原始类型(raw type)。原始类型的名字就是删去类型参数后的泛型类型名。擦除(erased)类型变量,并替换为限定类型(无限定的变量用Object)

例如,定义一个泛型类Pair<T>

public class Pair<T> {
    private T first;

    private T second;

    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }
}

对应的原始类型

public class Pair{
    private Object first;

    private Object second;

    public Pair(Object first, Object second) {
        this.first = first;
        this.second = second;
    }

    public Object getFirst() {
        return first;
    }

    public void setFirst(Object first) {
        this.first = first;
    }

    public Object getSecond() {
        return second;
    }

    public void setSecond(Object second) {
        this.second = second;
    }
}

带有限定的泛型类型

public class Pair<T extends Comparable<T>&Serializable> {
    private T frist;

    private T second;

    public Pair(T frist, T second) {
        this.frist = frist;
        this.second = second;
    }

    public T getFrist() {
        return frist;
    }

    public void setFrist(T frist) {
        this.frist = frist;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }
}

对应的原始类型如下

public class Pair{
    private Comparable frist;

    private Comparable second;

    public Pair(Comparable frist, Comparable second) {
        this.frist = frist;
        this.second = second;
    }

    public Comparable getFrist() {
        return frist;
    }

    public void setFrist(Comparable frist) {
        this.frist = frist;
    }

    public Comparable getSecond() {
        return second;
    }

    public void setSecond(Comparable second) {
        this.second = second;
    }
}

获取指定字段的原始类型和泛型类型的示例

Class<Pair> cls = Pair.class;
Field first = cls.getDeclaredField("frist");

//获取原始类型
Class<?> type = first.getType();
System.out.println(type.getSimpleName()); //output: Comparable

//获取泛型类型
Type genericType = first.getGenericType();
String name = ((TypeVariable) genericType).getName();
System.out.println(name); //output: T

参数类型(Parameterized Type)

public class ParameterizedTypeReflection<T> {

    List<? extends Number> list;
    List<?> list2;
    List<? super Comparable<T>> list3;

    public static void main(String[] args) {
        Class<?> cls = ParameterizedTypeReflection.class;
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            field.getGenericType().getClass(); //return: ParameterizedTypeImpl
            //反射获取
            Type genericType = field.getGenericType();
            System.out.println(genericType.getTypeName());
        }
    }

}
/*
java.util.List<? extends java.lang.Number>
java.util.List<?>
java.util.List<? super java.lang.Comparable<T>>

*/

数组类型(Array Type)

包括基本类型数组,引用类型数组,泛型数组

基本类型数组:int[]

引用类型数组:Integer[]

泛型数组:T[]

public class ArrayReflection<T> {

    //基本类型数组
    private int[] primitArr;

    //引用类型数组
    private Integer[] referenceArr;

    //泛型数组
    private T[] GenericArr;

    public static void main(String[] args) {
        Class<ArrayReflection> cls = ArrayReflection.class;
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            //反射获取
            Type genericType = field.getGenericType();
            System.out.println(genericType.getTypeName());
        }
    }

}
/*
output:
    int[]
    java.lang.Integer[]
    T[]
*/

类型变量(Type Variables)

public class PrimitiveTypeReflection<T, D, Y> {

    T name;

    D age;

    Y love;

    public static void main(String[] args) {
        Class<?> cls = PrimitiveTypeReflection.class;
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            //反射获取类型变量
            Type genericType = field.getGenericType();
            genericType.getClass(); //return TypeVariable
            System.out.println(genericType.getTypeName());
        }
    }
}
/*
T
D
Y

*/

基本类型(Primitive Type)

public class PrimitiveTypeReflection<T> {

    private int age;

    private boolean isTall;

    private char c;

    public static void main(String[] args) {
        Class<?> cls = PrimitiveTypeReflection.class;
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            //反射获取基本类型
            Class<?> type = field.getType();
            String name = type.getName();
            System.out.println(name);
        }
    }
}
/*
int
boolean
char

*/

results matching ""

    No results matching ""