Java民工的鐵皮房

          Consciousness Of Programming - wjywilliam 想飛,總是會(huì)飛的......
          posts - 8, comments - 14, trackbacks - 0, articles - 9
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Reflct反射機(jī)制一些基本用法

          Posted on 2009-02-10 14:40 wjywilliam 閱讀(2126) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): Java
          PS:若轉(zhuǎn)載發(fā)布此文章或相關(guān)代碼,請(qǐng)注明出處,謝。
          最近用到了reflct機(jī)制,此前并不熟悉,趁此機(jī)會(huì)留個(gè)底,怕忘記了,只是些小應(yīng)用而已。

          1. 動(dòng)態(tài)匹配方法名字賦值
          需求:
          一個(gè)tempLoan bean里面有幾個(gè)屬性 setPsAddr11,setPsAddr12,setPsAddr13,但是從DB里面取出來(lái)的只有一個(gè)psAddr1 field值,值是
          “A~B~C”的結(jié)構(gòu)。需要分別把值A(chǔ)賦到psAddr11,B賦到psAddr12,C賦到psAddr13。
          為了以免后面再增加屬性例如4,5,6之類(lèi)的,不采取手工硬塞動(dòng)作,故此采取反射,統(tǒng)一邏輯處理。
          如下代碼:
          1Class?tempLoanClass?=?tempLoan.getClass();
          2????????????????if(tempLoan.getPsAddr1()!=null){
          3????????????????????List<String>?psAddress1List?=?Arrays.asList(tempLoan.getPsAddr1().split("~"));
          4????????????????????for?(int?x?=?0;?x?<?psAddress1List.size();?x++)?{
          5????????????????????????Method?method?=?tempLoanClass.getDeclaredMethod("setPsAddr1"?+?(x?+?1),?new?Class[]?{?String.class?});
          6????????????????????????method.invoke(tempLoan,?new?Object[]?{?psAddress1List.get(x)?});
          7????????????????????}
          ????
          8????????????????}
          如上用loop來(lái)映射set的方法,由對(duì)應(yīng)的get方法取出來(lái)list的元素的值,按照順序動(dòng)態(tài)賦給tempLoan 的set方法。

          2. 根據(jù)參數(shù)對(duì)應(yīng)Bean里面的變量名,把Bean內(nèi)所對(duì)應(yīng)的變量的值賦給另一個(gè)變量
          需求:
          根據(jù)傳入?yún)?shù)一個(gè)變量名和一個(gè)BO,匹配BO里面的屬性,若與傳入變量名的值相同,則取BO對(duì)應(yīng)屬性的值賦于另一變量
          ?1public?void?setValueInField(Loan?loan,?String?fieldName,?String?fieldValue)?throws?Exception{
          ?2????????try{
          ?3????????????Class?tempLoanClass?=?loan.getClass();
          ?4????????????Method[]?methods?=?tempLoanClass.getMethods();
          ?5????????????for(int?x=0;?x<methods.length;?x++){
          ?6????????????????String?methodName?=?methods[x].getName();
          ?7????????????????if(methodName.indexOf("get")>-1){
          ?8????????????????????if(methodName.substring(3,?methodName.length()).equalsIgnoreCase(fieldName)){
          ?9????????????????????????Object?value?=?methods[x].invoke(loan,?new?Object[]?{});
          10????????????????????????if(value?!=?null){
          11????????????????????????????fieldValue?=?value.toString();
          12????????????????????????}

          13????????????????????}

          14????????????????}

          15????????????}

          16????????}
          catch(Exception?e){
          17????????????e.printStackTrace();
          18????????}

          19????}

          3. 這個(gè)比較尋常了,就是列出一個(gè)Class所有的全局變量名
          //?Retrieve?global?variable?object?in?class
          ???Object?obj?=?new?Mytest();
          ????????Field[]?fields?
          =?obj.getClass().getDeclaredFields();
          ????????
          for?(int?i?=?0,?len?=?fields.length;?i?<?len;?i++)?{
          ????????????String?varName?
          =?fields[i].getName();
          ????????????
          try?{
          ????????????????
          boolean?accessFlag?=?fields[i].isAccessible();
          ????????????????fields[i].setAccessible(
          true);
          ????????????????Object?o?
          =?fields[i].get(obj);
          ????????????????System.out.println(
          "Include?variable:"?+?varName?+?"?=?"?+?o);
          ????????????????fields[i].setAccessible(accessFlag);
          ????????????}
          ?catch?(IllegalArgumentException?ex)?{
          ????????????????ex.printStackTrace();
          ????????????}
          ?catch?(IllegalAccessException?ex)?{
          ????????????????ex.printStackTrace();
          ????????????}

          ????????}


          ?

          評(píng)論

          # re: Reflct反射機(jī)制用法的一些應(yīng)用  回復(fù)  更多評(píng)論   

          2009-02-10 15:23 by ci
          good....

          # re: Reflct反射機(jī)制用法的一些應(yīng)用  回復(fù)  更多評(píng)論   

          2009-02-10 23:38 by 與你同飛
          java的基本功

          # re: Reflct反射機(jī)制一些基本用法  回復(fù)  更多評(píng)論   

          2009-03-01 20:25 by baby
          Excellent~ support you, wjywilliam

          # re: Reflct反射機(jī)制一些基本用法  回復(fù)  更多評(píng)論   

          2009-05-23 08:00 by xk
          非常不錯(cuò),有需求有解決辦法,我一下就看懂反射了,謝謝!~~~

          # re: Reflct反射機(jī)制一些基本用法  回復(fù)  更多評(píng)論   

          2009-10-14 17:30 by gggggggg
          <script>alert('AA')</script>

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 青河县| 仪陇县| 五家渠市| 房产| 自贡市| 乐山市| 武山县| 凤城市| 公主岭市| 桐庐县| 城市| 新平| 沁源县| 凉山| 崇义县| 丰台区| 伊宁县| 山东省| 库尔勒市| 安塞县| 铜陵市| 广安市| 石狮市| 贵阳市| 桦川县| 神木县| 五大连池市| 昭苏县| 仙游县| 山东省| 金乡县| 顺义区| 邢台市| 栖霞市| 肥东县| 定远县| 靖宇县| 尖扎县| 岳池县| 麻城市| 锡林浩特市|