DANCE WITH 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()函數的參數,就可以對應上邊的問題了。

          posted on 2007-02-10 23:24 dreamstone 閱讀(3838) 評論(0)  編輯  收藏 所屬分類: jdk相關

          主站蜘蛛池模板: 马关县| 马鞍山市| 襄樊市| 克什克腾旗| 中山市| 延津县| 九江市| 道孚县| 玉树县| 宽城| 新民市| 靖江市| 仙居县| 句容市| 祁阳县| 彰化县| 石河子市| 元江| 谢通门县| 页游| 通海县| 舒城县| 耿马| 吉首市| 赞皇县| 吉隆县| 开平市| 罗城| 闽清县| 略阳县| 姜堰市| 富源县| 柏乡县| 绥化市| 望城县| 稻城县| 石嘴山市| 岳西县| 上虞市| 浦江县| 成武县|