Java中Type接口及其子類


簡介

Type是Java 編程語言中所有類型的公共高級接口,和Object不同,Object是所有類的父類,即Object是Type的父類。

分類

原始類型(Class):不僅僅包含我們平常所指的類,還包括枚舉、數組、注解等;

參數化類型(ParameterizedType):就是我們平常所用到的泛型List、Map;

數組類型(GenericArrayType):並不是我們工作中所使用的數組String[] 、byte[],而是帶有泛型的數組,即T[] ;

基本類型(Class):也就是我們所說的java的基本類型,即int,float,double等。

詳細分類

ParameterizedType

  • 含義:
    參數化類型,即泛型;例如:List 、Map<K,V>等帶有參數化的對象;
  • 代碼:
   /**
     *
     * ParameterizedType表示參數化類型,也就是泛型,例如List<T>、Set<T>等;
     **/
    private List<T> list=null;
    private List<T> set=null;

    @Test
    public void test() throws NoSuchFieldException {
        Field fieldList=ParameterizedTypeDemo.class.getDeclaredField("list");
        Type typeList = fieldList.getGenericType();
        //sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
        System.out.println("獲取的type類型 typeList-->"+typeList.getClass().getName());
        Field fieldSet=ParameterizedTypeDemo.class.getDeclaredField("set");
        Type typeSet = fieldSet.getGenericType();
        //sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
        System.out.println("獲取的type類型 typeSet-->"+typeSet.getClass().getName());
    }

    private Map<String,Integer> map=null;

    @Test
    public void tset2() throws NoSuchFieldException {
        Field declaredField = ParameterizedTypeDemo.class.getDeclaredField("map");
        Type genericType = declaredField.getGenericType();
        ParameterizedType parameterizedType=(ParameterizedType)genericType;
        Type name1 = parameterizedType.getActualTypeArguments()[0];
        //java.lang.String
        System.out.println("ParameterizedType 獲取參數1泛型類全名-->"+name1.getTypeName());
        Type name2 = parameterizedType.getActualTypeArguments()[1];
        //java.lang.Integer
        System.out.println("ParameterizedType 獲取參數2泛型類全名-->"+((Class)name2).getName());
        Type rawType = parameterizedType.getRawType();
        //interface java.util.Map
        System.out.println("獲取聲明泛型的類或者接口---》"+rawType);
    }

TypeVariable

  • 含義:
    類型變量,即泛型中的變量;例如:T、K、V等變量,可以表示任何類;在這需要強調的是,TypeVariable代表着泛型中的變量,而ParameterizedType則代表整個泛型;
  • 代碼:
private List<T> list;

    /**
     * 泛型的類型變量,指的是List<T>、Map<K,V>中的T,K,V等值,實際的Java類型是TypeVariableImpl
     * (TypeVariable的子類);此外,還可以對類型變量加上extend限定,這樣會有類型變量對應的上限;
     *
     **/
    @Test
    public void test() throws NoSuchFieldException {
        Field list = TypeVariableDemo.class.getDeclaredField("list");
        //獲取該屬性的實際類型
        Type genericType = list.getGenericType();
        ParameterizedType parameterizedType=(ParameterizedType)genericType;
        //獲取泛型中的實際類型
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
         //sun.reflect.generics.reflectiveObjects.TypeVariableImpl
        System.out.println("獲取泛型中的實際類型-->"+actualTypeArguments[0].getClass().getName());
    }

    @Test
    public void test2() throws NoSuchFieldException {
       new TypeVariableTwoDemo().test();

    }

    public class TypeVariableTwoDemo<T extends Number & Serializable & Comparable,K>{

        private T t;
        private K k;


        public void test() throws NoSuchFieldException {

            Field field = TypeVariableTwoDemo.class.getDeclaredField("t");
            Type genericType = field.getGenericType();
            TypeVariable typeVariable=(TypeVariable)genericType;
            Type[] bounds = typeVariable.getBounds();
            //class java.lang.Number
            //interface java.io.Serializable
            //interface java.lang.Comparable
            Arrays.stream(bounds).forEach(s-> System.out.println("獲取類型變量的上界-->"+s));

            Field field2 = TypeVariableTwoDemo.class.getDeclaredField("k");
            Type genericType2 = field2.getGenericType();
            TypeVariable typeVariable2=(TypeVariable)genericType2;
            Type[] bounds2 = typeVariable2.getBounds();
            //class java.lang.Object
            Arrays.stream(bounds2).forEach(s-> System.out.println("獲取類型變量的上界-->"+s));
            //class com.yxkj.other.modular.reflection.type.TypeVariableDemo$TypeVariableTwoDemo
            System.out.println("獲取聲明該類型變量實體-->"+typeVariable2.getGenericDeclaration());
            //K
            System.out.println("獲取聲明該類型變量實體-->"+typeVariable2.getName());
        }
    }	

GenericArrayType

  • 含義:
    泛型數組類型,用來描述ParameterizedType、TypeVariable類型的數組;即List [] 、T[]等;
  • 代碼:
private T[] t;

    private List<String>[] listArray;

    /**
     *  泛型數組類型,例如List<String>[] 、T[]等;
     *
     **/
    @Test
    public void test() throws NoSuchFieldException {
        Field t = GenericArraytypeDemo.class.getDeclaredField("t");
        Type genericType = t.getGenericType();
        //sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl
        System.out.println("獲取Type的實際類型-->"+genericType.getClass().getName());
    }

    @Test
    public void test2() throws NoSuchFieldException {
        Field t = GenericArraytypeDemo.class.getDeclaredField("listArray");
        Type genericType = t.getGenericType();
        GenericArrayType genericType1 = (GenericArrayType) genericType;
        Type genericComponentType = genericType1.getGenericComponentType();
        //java.util.List<java.lang.String>
        System.out.println("獲取listArray的實際類型-->"+genericComponentType);
    }

Class

  • 含義:
    上三者不同,Class是Type的一個實現類,屬於原始類型,是Java反射的基礎,對Java類的抽象;

在程序運行期間,每一個類都對應一個Class對象,這個對象包含了類的修飾符、方法,屬性、構造等信息,所以我們可以對這個Class對象進行相應的操作,這就是Java的反射;
*代碼:

private ClassDemo classDemo;
    
    /**
     *
     * 在Java中,每個.class文件在程序運行期間,都對應着一個Class對象,
     * 這個對象保存有這個類的全部信息;因此,Class對象也稱之為Java反射的基礎
     *
     **/
    @Test
    public void test() throws NoSuchFieldException {
        Field field = ClassDemo.class.getDeclaredField("classDemo");
        Type genericType = field.getGenericType();
        //class com.yxkj.other.modular.reflection.type.ClassDemo
        System.out.println("獲取Type原始類型-->"+genericType);
    }

WildcardType

  • 含義:
    泛型表達式(或者通配符表達式),即? extend Number、? super Integer這樣的表達式;WildcardType雖然是Type的子接口,但卻不是Java類型中的一種;
    *代碼:
    private List<? extends Number> listNum;

    private List<? super String> listStr;

    /**
     *
     *  ?---通配符表達式,表示通配符泛型,但是WildcardType並不屬於Java-Type中的一鍾;
     *  例如:List<? extends Number> 和 List<? super Integer>;
     *
     **/
    @Test
    public void test() throws NoSuchFieldException {
        Field declaredField = WildcardTypeDemo.class.getDeclaredField("listNum");
        Type genericType = declaredField.getGenericType();
        ParameterizedType parameterizedType=(ParameterizedType)genericType;
        //獲取泛型中的實際類型
        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
        //class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
        System.out.println("獲取泛型中的實際類型-->"+actualTypeArguments[0].getClass());
        WildcardType wildcardType= (WildcardType)actualTypeArguments[0];

        Type[] upperBounds = wildcardType.getUpperBounds();
        System.out.println("獲取泛型變量的上邊界-->"+upperBounds[0]);




        Field declaredFieldlowerBounds = WildcardTypeDemo.class.getDeclaredField("listStr");
        Type genericTypelowerBounds = declaredFieldlowerBounds.getGenericType();
        ParameterizedType parameterizedTypelowerBounds=(ParameterizedType)genericTypelowerBounds;
        //獲取泛型中的實際類型
        Type[] actualTypeArgumentslowerBounds = parameterizedTypelowerBounds.getActualTypeArguments();
        WildcardType wildcardTypelowerBounds= (WildcardType)actualTypeArgumentslowerBounds[0];

        Type[] lowerBounds = wildcardTypelowerBounds.getLowerBounds();

        System.out.println("獲取泛型變量的下邊界-->"+lowerBounds[0]);



    }

Gitee案例地址

https://gitee.com/zhuayng/foundation-study/tree/develop/JavaBasis/Other/src/main/java/com/yxkj/other/modular/reflection/type

參考

https://www.cnblogs.com/linghu-java/p/8067886.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM