java 反射和泛型-反射來獲取泛型信息


通過指定對應的Class對象,程序可以獲得該類里面所有的Field,不管該Field使用private 方法public。獲得Field對象后都可以使用getType()來獲取其類型。

Class<?> type = f.getType();//獲得字段的類型

但此方法只對普通Field有效,若該Field有泛型修飾,則不能准確得到該Field的泛型參數,如Map<String,Integer>;

為了獲得指定Field的泛型類型,我們采用:

Type gType = f.getGenericType();得到泛型類型

然后將Type對象強轉為ParameterizedType,其表示增加泛型后的類型

Type getRawType()//返回被泛型限制的類型;

Type[]  getActualTypeArguments()//返回泛型參數類型;

 

利用反射來獲取泛型的類型(泛型信息)

步驟:

1.獲取當前類

2.獲取目標字段

3.獲取包含泛型類型的類型 getGenericType()

4.強轉至子類ParameterizedType因為Type沒有任何對應的方法

5.獲得泛型真正的類型 getActualTypeArguments()

 

例子

package junereflect624;

 

import java.lang.reflect.Field;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.HashMap;

import java.util.Map;

 

public class GetGenericTypeDemo14 {

    Map<String,Integer> map = new HashMap<String,Integer>();

   

    public static void main(String[] args) throws Exception {

        Class c = GetGenericTypeDemo14.class;

        Field f = c.getDeclaredField("map");

        System.out.println(f);

        System.out.println(f.getName());//map

       

        // Class<?> getType()  返回一個 Class 對象,它標識了此 Field 對象所表示字段的聲明類型。

        Class cl = f.getType();

        System.out.println("獲得其類型:"+cl);

//獲得其類型:interface java.util.Map

       

        /**

         *  Type getGenericType() 返回一個 Type 對象,它表示此 Field 對象所表示字段的聲明類型。

         *  Type是Class的接口;

         */

        Type t = f.getGenericType();//包含泛型的類型

        System.out.println(t);

//java.util.Map<java.lang.String, java.lang.Integer>

       

 

        /**

         * Type這個類里面沒有任何的方法,所以需要調用子類的方法,那么大的類型轉到小的類型,需要強轉!

         */

        ParameterizedType pt = (ParameterizedType)t;//強轉到其子類

        /**

         *  Type[] getActualTypeArguments()

                      返回表示此類型實際類型參數的 Type對象的數組。

             Type getOwnerType()

                      返回 Type 對象,表示此類型是其成員之一的類型。

             Type getRawType()

                      返回 Type 對象,表示聲明此類型的類或接口。

         */

       

        t = pt.getRawType();//類型的類或接口

        System.out.println(t);

       

        Type[] ts = pt.getActualTypeArguments();

        for (Type type : ts) {

            System.out.println(type);

            /**

             *  class java.lang.String

                class java.lang.Integer

             */

        }

    }

}

打印:

java.util.Map junereflect624.GetGenericTypeDemo14.map

map

獲得其類型:interface java.util.Map

java.util.Map<java.lang.String, java.lang.Integer>

interface java.util.Map

class java.lang.String

class java.lang.Integer

 

我的總結:多查找api,參考api中方法使用的限制,比如是否靜態、返回值類型等。

 


免責聲明!

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



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