隨筆-31  評(píng)論-257  文章-0  trackbacks-0
                在Java運(yùn)行時(shí)環(huán)境中,對(duì)于任意一個(gè)類,能否知道這個(gè)類有哪些屬性和方法?對(duì)于任意一個(gè)對(duì)象,能否調(diào)用它的任意一個(gè)方法?答案是肯定的。這種動(dòng)態(tài)獲取類的信息,以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能來自于Java語言的反射(Reflection)機(jī)制。Java反射機(jī)制主要提供以下功能:

          [*]在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
          [*]在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;
          [*]在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;
          [*]在運(yùn)行時(shí)調(diào)用任意一個(gè)類的方法;
          [*]生成動(dòng)態(tài)代理;


                在JDK中,主要由以下類來實(shí)現(xiàn)Java反射機(jī)制,這些類都位于 java.lang.reflect 包中。

                [*] Class 類:代表一個(gè)類。
                [*] Field 類:代表類的成員變量
                [*] Method 類:代表類的方法
                [*] Constructor 類:代表類的構(gòu)造方法
                [*] Array 類:提供了動(dòng)態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組元素的靜態(tài)方法


          看看下面例子:它讀取命令行參數(shù)指定的類名,然后打印這個(gè)類的所具有的方法信息:
           1 import java.lang.reflect.*;
           2 public class DumpMethods{
           3     public static void main(String[] args)thorws Exception{
           4         //加載并初始化命令行參數(shù)指定的類
           5      Class classType = Class.forName(args[0]);
           6         //獲得類的所有方法
           7      Method[] methods = classType.getDeclaredMethods();
           8         for(int i=0;i<methods.length;i++){
           9             System.out.println(methods[i].toString());
          10         }
          11     }
          12 }


          運(yùn)行命令 “java DumpMethods java.util.Stack”,就會(huì)顯示java.util.Stack 類所具有的方法。

          這個(gè)只是十分之基本,很簡單的示例,Java的反射還可以做很多東西,可以跟據(jù)用戶的輸入就可以得知哪些類,需要做什么操作,就是說動(dòng)態(tài)跟據(jù)需要來調(diào)用相應(yīng)的類與相應(yīng)的方法,我之前也做過,用Struts結(jié)合Java反射來實(shí)現(xiàn)一些功能,有些時(shí)候,別人的接口代碼里只返回一個(gè)Object給你,而你就要用反射來得知該Object是屬于哪一個(gè)類型,之后根據(jù)設(shè)置做相應(yīng)的操作,不知道大家有用過Hibernate沒有,這個(gè)框架就是大量用到了Java反射,用戶只需配置一下XML文件,Hibernate運(yùn)行時(shí),就會(huì)讀取解析XML配置文件,之后動(dòng)態(tài)找相應(yīng)的類,實(shí)例化相應(yīng)的POJO等等,這些都是全動(dòng)態(tài)化的,也就是說,我請(qǐng)求這個(gè)表的數(shù)據(jù)時(shí),就自動(dòng)實(shí)例化該表的POJO實(shí)例,這些都是在XML配置文件里定義好映射關(guān)系。ORM框架就如此,很多中間件也是大量使用反射,將反射靈活的運(yùn)用起來,將會(huì)得到意想不到的效果,這也是Java的半動(dòng)態(tài)語言吧。使編程工作變得十分靈活。
          posted on 2008-07-29 13:00 姜大叔 閱讀(292) 評(píng)論(1)  編輯  收藏 所屬分類: Java

          評(píng)論:
          # re: Java反射機(jī)制 2009-04-07 16:17 | guooo
          寫的不錯(cuò)  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 漳平市| 常山县| 禄劝| 莒南县| 万年县| 葫芦岛市| 探索| 冕宁县| 乡宁县| 万安县| 蒙自县| 阜康市| 读书| 五常市| 沧州市| 奉化市| 云霄县| 辉南县| 英吉沙县| 宾川县| 金溪县| 吴桥县| 东兴市| 安溪县| 布尔津县| 科技| 临湘市| 沁源县| 衡阳县| 阿合奇县| 龙江县| 丰顺县| 佛坪县| 宁晋县| 德兴市| 丹阳市| 安庆市| 依兰县| 巴林右旗| 凉城县| 吴桥县|