利用反射取得泛型信息 – JAVA編程語言程序開發技術文章

一、傳統通過反射取得函數的參數和返回值


 import  java.lang.reflect.Method;
 import  java.lang.reflect.ParameterizedType;
 import  java.lang.reflect.Type;
 import  java.util.ArrayList;
 import  java.util.Map;
 import  java.util.List;
 import  java.util.Set;
 


 import  sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
 
 public   class  Foo  {
     public   static   void  main(String[] args)  throws  Exception   {
     Method[] methods  =  Foo. class .getDeclaredMethods();
      for (Method method : methods)  {
      Class[] paramTypeList  =  method.getParameterTypes();
     
      Class returnType  =  method.getReturnType();
      System.out.println(returnType);
       for (Class clazz:paramTypeList)  {
          System.out.println(clazz);
      }
      System.out.println();
     }
 }
      public   static  String test1(String str)  {
      return   null ;
    }
      public   static  Integer test2(String str,Integer i)  {
      return   null ;
    }
  
}
 
 


二、在有泛型的時候,取得參數和返回值的集合類的泛型信息



 import  java.lang.reflect.Method;
 import  java.lang.reflect.ParameterizedType;
 import  java.lang.reflect.Type;
 import  java.util.ArrayList;
 import  java.util.Map;
 import  java.util.List;
 import  java.util.Set;


 import  sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;


 public   class  Foo   {
     public   static   void  main(String[] args)  throws  Exception   {
        Method[] methods  =  Foo. class .getDeclaredMethods();
         for  (Method method : methods)   {
            System.out.println( ” returnType: ” );
            Type returnType  =  method.getGenericReturnType();
             if  (returnType  instanceof  ParameterizedType)  {
                Type[] types  =  ((ParameterizedType)returnType).getActualTypeArguments();
                 for (Type type:types)  {
                    System.out.println(type);
                }
            }
            System.out.println( ” paramTypeType: ” );
            Type[] paramTypeList  =  method.getGenericParameterTypes();
             for  (Type paramType : paramTypeList)   {
                 if  (paramType  instanceof  ParameterizedType)  {
                    Type[] types  =  ((ParameterizedType)paramType).getActualTypeArguments();
                     for (Type type:types)  {
                        System.out.println(type);
                    }
                }
            }
        }
    }
 
      public   static  List < String >  test3(List < Integer >  list)   {
         return   null ;
    }
 
      private   static  Map < String, Double >  test4(Map < String, Object >  map)   {
         return   null ;
    }
 
}
 
三、應用環境
例如你要寫一個程序,需求把一個如下的配置文件變成一個集合類。



 < config name = ” Foo.DoubleBean ” >
     < element key = ” key1 ”  value = ” 1.1 ” />
     < element key = ” key2 ”  value = ” 2.2 ” />
     < element key = ” key3 ”  value = ” 3.3 ” />
 </ config >
根據用戶的參數變成不同的集合類 Map<String.String>     Map<String,Double>   Map<String,Float>
如果你要著手開發一個框架,這樣的需求會比較常見。這個時候取到setXX()函數的參數,就可以對應上邊的問題瞭

發佈留言