qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java學習之反射機制

          java語言區別于C,C++等準靜態語言的最大特點就是java的反射機制。靜態語言的最直接定義就是不能在運行時改變程序結構或變量的類型.按照這樣的定義,python,ruby是動態語言,C,C++,Java不是動態語言。雖然在這樣的定義下java不是動態語言,但java的反射機制(Reflection)卻是可實現動態的相關機制。java反射機制的作用有
            1、在運行時判斷任意一個類所具有的成員變量和方法
            2、在運行時構造任意一個類的對象
            3、在運行時判斷任意一個對象所屬的類
            4、在運行時調用任意一個對象的方法
            在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,
            1、Class類:代表一個類。
            2、Constructor類:表示類的構造方法,通過該類來操作構造方法
            3、Field類:代表類的成員變量(屬性)。
            4、Method類:代表類的方法。通過該類可操作方法。
            5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。
            Class 類十分特殊。它和一般類一樣繼承自Object,當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。Class并沒有構造方法,不能人為生成。
            要想使用java的反射,首先要獲得類的Class,而獲得的方法有以下幾種
            String str = "CIACs";
            1、Class c1 = str.getClass();
            2、Class c2 = Class.forName("java.lang.String");//調用Class的靜態方法
            3、Class c3 = String.class;//每個包裝類都有自身的class
            獲得Class后,就可以生成對象了,對象的構造方法有帶參數的和不帶參數的,當通過不帶參數的構造方法來生成對象時有以下兩種方式
            1、通過newInstance()方法生成
            Class<?> classType = str.getClass();
            Object obj = classType.newInstance();
            2、通過構造方法實現
            Class<?> classType = str.getClass();
            Constructor con = classType.getConstructor(new Class[]{});
            Object obj = con.newInstance(new Object[]{});
            若要通過帶參數的構造方法生成對象實例,就只能使用如下方法
            Class<?> classType = str.getClass();
            Constructor con = classType.getConstructor(new Class[]{String.class});
            Object obj = con.newInstance(new Object[]{"CIACs"});
           獲得類的對象實例后就可以操作對象的方法和屬性了。以下是一個例子
          1packagereflection;
          2
          3importjava.lang.reflect.InvocationTargetException;
          4importjava.lang.reflect.Method;
          5
          6publicclassTestClass{
          7
          8publicintadd(inta,intb)
          9{
          10returna+b;
          11}
          12
          13publicStringecho(Stringstr)
          14{
          15returnstr;
          16}
          17
          18publicstaticvoidmain(String[]args)throwsException{
          19Class<?>classType=TestClass.class;//獲得Class
          20
          21ObjectTest=classType.newInstance();//通過classType獲得對象實例
          22
          23MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//運行中獲得add方法
          24
          25Objectresult=addMethod.invoke(Test,newObject[]{1,2});//傳入參數調用add方法
          26
          27System.out.println((Integer)result);
          28
          29MethodechoMethod=classType.getMethod("echo",newClass[]{String.class});
          30
          31Objectresult2=echoMethod.invoke(Test,newObject[]{"http://www.cnblogs.com/zhi-hao/"});
          32
          33System.out.println(result2);
          34
          35}
          36
          37}
            運行結果:
            java學習中反射機制跟動態代理相關,動態代理也是java中的重要知識。

          posted on 2014-09-12 09:56 順其自然EVO 閱讀(186) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 三亚市| 元阳县| 临湘市| 上虞市| 绍兴市| 丹寨县| 湘阴县| 金平| 济南市| 梓潼县| 沁水县| 云和县| 宜黄县| 江达县| 蒙城县| 乌拉特前旗| 郎溪县| 繁昌县| 盱眙县| 视频| 石楼县| 咸阳市| 六枝特区| 邻水| 新泰市| 隆林| 新化县| 抚松县| 区。| 望城县| 丰原市| 阳谷县| 铁岭县| 鹤庆县| 保靖县| 陕西省| 历史| 镶黄旗| 东乡县| 什邡市| 报价|