分享

利用反射取得泛型信息

 9loong 2008-08-20

一、传统通过反射取得函数的参数和返回值

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()函数的参数,就可以对应上边的问题了。
 
(#)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多