乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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、char、short、intlong、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)購(gòu)買等信息,謹(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)論公約

        類似文章 更多