qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Java學(xué)習(xí)之反射機制

          java語言區(qū)別于C,C++等準靜態(tài)語言的最大特點就是java的反射機制。靜態(tài)語言的最直接定義就是不能在運行時改變程序結(jié)構(gòu)或變量的類型.按照這樣的定義,python,ruby是動態(tài)語言,C,C++,Java不是動態(tài)語言。雖然在這樣的定義下java不是動態(tài)語言,但java的反射機制(Reflection)卻是可實現(xiàn)動態(tài)的相關(guān)機制。java反射機制的作用有
            1、在運行時判斷任意一個類所具有的成員變量和方法
            2、在運行時構(gòu)造任意一個類的對象
            3、在運行時判斷任意一個對象所屬的類
            4、在運行時調(diào)用任意一個對象的方法
            在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,
            1、Class類:代表一個類。
            2、Constructor類:表示類的構(gòu)造方法,通過該類來操作構(gòu)造方法
            3、Field類:代表類的成員變量(屬性)。
            4、Method類:代表類的方法。通過該類可操作方法。
            5、Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法。
            Class 類十分特殊。它和一般類一樣繼承自O(shè)bject,當(dāng)一個class被加載,或當(dāng)加載器(class loader)的defineClass()被JVM調(diào)用,JVM 便自動產(chǎn)生一個Class 對象。Class并沒有構(gòu)造方法,不能人為生成。
            要想使用java的反射,首先要獲得類的Class,而獲得的方法有以下幾種
            String str = "CIACs";
            1、Class c1 = str.getClass();
            2、Class c2 = Class.forName("java.lang.String");//調(diào)用Class的靜態(tài)方法
            3、Class c3 = String.class;//每個包裝類都有自身的class
            獲得Class后,就可以生成對象了,對象的構(gòu)造方法有帶參數(shù)的和不帶參數(shù)的,當(dāng)通過不帶參數(shù)的構(gòu)造方法來生成對象時有以下兩種方式
            1、通過newInstance()方法生成
            Class<?> classType = str.getClass();
            Object obj = classType.newInstance();
            2、通過構(gòu)造方法實現(xiàn)
            Class<?> classType = str.getClass();
            Constructor con = classType.getConstructor(new Class[]{});
            Object obj = con.newInstance(new Object[]{});
            若要通過帶參數(shù)的構(gòu)造方法生成對象實例,就只能使用如下方法
            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});//傳入?yún)?shù)調(diào)用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}
            運行結(jié)果:
            java學(xué)習(xí)中反射機制跟動態(tài)代理相關(guān),動態(tài)代理也是java中的重要知識。

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

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 拜城县| 柳江县| 成安县| 象州县| 武陟县| 香河县| 康定县| 绍兴县| 弥勒县| 福泉市| 顺义区| 石河子市| 晋江市| 林州市| 忻城县| 通许县| 繁昌县| 安义县| 卢氏县| 永丰县| 成安县| 思南县| 南康市| 高淳县| 平南县| 无为县| 枣强县| 新津县| 阳原县| 张掖市| 麻城市| 互助| 高密市| 梓潼县| 和田市| 阿尔山市| 绵阳市| 宜川县| 松原市| 阜宁县| 玉环县|