DANCE WITH JAVA

          開發出高質量的系統

          導航

          <2007年2月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728123
          45678910

          隨筆分類(277)

          隨筆檔案(238)

          閱讀排行榜

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          利用反射取得泛型信息

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

          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 閱讀(3834) 評論(0)  編輯  收藏 所屬分類: jdk相關

          主站蜘蛛池模板: 钟山县| 安义县| 贵溪市| 潼南县| 军事| 隆德县| 鄢陵县| 宿迁市| 尼勒克县| 鹿邑县| 南华县| 盘锦市| 绥江县| 石林| 城市| 花莲市| 乌拉特前旗| 易门县| 东乡族自治县| 永仁县| 澄城县| 武定县| 娄底市| 宿州市| 民乐县| 古浪县| 洛宁县| 临沭县| 阳信县| 北京市| 沅陵县| 调兵山市| 吉木萨尔县| 石门县| 淮南市| 思南县| 太和县| 桂阳县| 雷波县| 朝阳区| 女性|