日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java里如何獲取泛型的類型

 CevenCheng 2012-04-29

jdk1.5開始支持泛型,所以我們有時(shí)需要把泛型里定義的對(duì)象的類型拿到,研究了一下sample代碼

可以這樣來做

比如現(xiàn)在我定義了三個(gè)類Account, AccountItem和Product類。

Account聚合AccountItem,AccountItem聚合Prodcut。

都是用List<AccountItem>和List<Product>來表示的

我要實(shí)現(xiàn)一個(gè)功能,需要動(dòng)態(tài)的傳入一個(gè)Class的類型,然后反射到啟動(dòng)的List,根據(jù)List里定義的泛型,知道其中List的具體對(duì)象。

這個(gè)需求主要是由于現(xiàn)在的Json-lib還不支持深度的List的unmarshall,而只支持?jǐn)?shù)組的方式。其實(shí)這里就是json-lib的beanfactory用到ezmorpher,而ezmorpher不支持泛型的定義方式,所以不知道類型,全轉(zhuǎn)成MorpherDynBean,這樣的對(duì)象是我們不需要的。

這樣需要修改ezmorpher的代碼,注入自己的MorpherBean的processor,這個(gè)processor就根據(jù)泛型拿到,我們需要轉(zhuǎn)型的對(duì)象。

代碼片段如下

 

引用:

Field[] fs = clazz.getDeclaredFields(); // 得到所有的fields

for(Field f : fs) 

    Class fieldClazz = f.getType(); // 得到field的class及類型全路徑

    if(fieldClazz.isPrimitive())  continue;  //【1】 //判斷是否為基本類型

    if(fieldClazz.getName().startsWith("java.lang")) continue; //getName()返回field的類型全路徑;

    if(fieldClazz.isAssignableFrom(List.class)) //【2】
    { 
             Type fc = f.getGenericType(); // 關(guān)鍵的地方,如果是List類型,得到其Generic的類型

             if(fc == null) continue;

             if(fc instanceof ParameterizedType) // 【3】如果是泛型參數(shù)的類型 
            { 
                   ParameterizedType pt = (ParameterizedType) fc;

                   Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class類型對(duì)象。

                   m.put(f.getName(), genericClazz);

                   Map<String, Class> m1 = prepareMap(genericClazz);

                   m.putAll(m1); 
             } 
      } 
}

 

【解釋】:

1、isPrimitive

public boolean isPrimitive()
判定指定的 Class 對(duì)象是否表示一個(gè)基本類型。

有九種預(yù)定義的 Class 對(duì)象,表示八個(gè)基本類型和 void。這些類對(duì)象由 Java 虛擬機(jī)創(chuàng)建,與其表示的基本類型同名,即 boolean、byte、charshort、int、long、float 和 double。 【注:像Integer,Boolean等包裝類不是基本類型!】

這些對(duì)象僅能通過下列聲明為 public static final 的變量訪問,也是使此方法返回 true 的僅有的幾個(gè) Class對(duì)象。  

返回: 當(dāng)且僅當(dāng)該類表示一個(gè)基本類型時(shí),才返回 true
從以下版本開始:JDK1.1
 
2、isAssignableFrom
    Java代碼
  1. System.out.println(String.class.isAssignableFrom(Object.class));   
  2. //打印true  

    AA.class.isAssignableFrom(BB.class)的作用是判定AA表示的類或接口是否同參數(shù)BB指定的類表示的類或接口相同,或AA是否是BB的父類。

   eg:

         System.out.println( String.class.isAssignableFrom(Object.class) ) ;       false
         System.out.println( Object.class.isAssignableFrom(Object.class) );       true
         System.out.println( Object.class.isAssignableFrom(String.class) );        true
         String ss = "";   
         System.out.println( ss instanceof Object );                                            true
         Object o = new   Object();
         System.out.println( o instanceof Object );                                              true

 3、ParameterizedType 表示參數(shù)化類型,如 Collection<String>。

 4、getGenericSuperclass, getSuperclass, getActualTypeArguments

     說明

           1.Class<? super T> getSuperclass():返回本類的父類

           2.Type getGenericSuperclass():返回本類的父類,包含泛型參數(shù)信息

      例子

          1.ClassA.java


             public class  ClassA <T>{     
                 private T obj;     
                 public void setObject(T obj) {      this.obj = obj;  }   
                 public T getObject() {    return obj;   }     
           } 

 

         2.Test.java


             import java.lang.reflect.Type;    
             import java.lang.reflect.ParameterizedType;   
             public class Test<T> extends ClassA<T>{     
                        public static void main(String args[]) throws Exception{     
                                 System.out.println("======getSuperclass======:");    
                                 System.out.println(Test.class.getSuperclass().getName());   
                                 System.out.println("======getGenericSuperclass======:");   
                                 Type t = Test.class.getGenericSuperclass();    
                                 System.out.println(t);     
                                 if (ParameterizedType.class.isAssignableFrom(t.getClass())) {  
                                          System.out.print("----------->getActualTypeArguments:");     
                                          for (Type t1:((ParameterizedType)t).getActualTypeArguments()) {     
                                                         System.out.print(t1 + ",");     
                                           }     
                                          System.out.println();     
                                 }  
                     }   
  
               } 

 

              輸出結(jié)果:

                    ======getSuperclass======:

                    ClassA

                    ======getGenericSuperclass======:

                    ClassA<T>

                    ----------->getActualTypeArguments:T,

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多