<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 100  文章 - 50  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    如果我們要在程序運行時動態地加載某個類,我們應該如何做呢?將要用到Reflection API,通過這種機制,我們可以而不知道類的名字,而得到類的所有函數的名字和類型,以及所有的數據成員的格式,而且,我們可以通過某些機制來動態的調用。通過Reflection API,可以實現強大的功能,就如同一個巨大的黑洞,可以接受一切東西,不管你是什么形態。事實上,編譯器,GUI,甚至是接口,都用到了Reflection。
       Reflection的基本功能是什么呢?1.運行時生成類的實例(instance),2.執行期間調用方法(Method),3.運行時修改數據成員(field)。
       要實現這么強大的功能,首先必須了解Class類,Class在這里是單獨的一個類,它位于java.lang包中,它用以描述程序的接口和類等信息,它本身沒有構造函數,但是可以通過以下三種方法獲得一個Class類的對象,它與某一個類或接口相關聯。
    對于任何類的對象,可以通過 Class object=對象名.getClass()的方式,getClass()函數是Object類中的成員函數。
    Class object=Class.forName(類名);forName()是Class類的一個靜態成員函數
    通過Class object=類名.class語法,對于基本數據類型(Primitive)的封裝類,可以通過類名.TYPE語法,這一點比較特殊。
       事實上,如果一個Class類的對象關聯了某一個類,那么可以通過Class類的成員newInstance()來利用關聯類的默認構造函數(即無參構造函數)來聲明該類的一個對象。但是如果要調用帶參數的構造函數,就要用到其他的方法。具體的步驟如下:
    1.Class 對象與某類相關聯。
    聲明用一個Class數組,(如parameter[])包含需要調用的構造函數所需要的參數類型信息
    調用Class類的getConstrutor(parameter)來尋找合適的構造函數,把他的值返回給一個Construtor的對象(此處設為cons),Constructor類在java.lang.reflect包下,需要單獨加載。
    聲明一個Object類的對象數組(此處設為 arg[]),這是實際參數。
    利用cons.newInstance(arg),即可獲得一個對應類的對象。(該函數位于java.lang.reflect.Constructor類中)
       動態調用成員函數的方法與之類似,不過對應的Constructor對象必須更改為一個Method類對象,Method類也在java.lang.reflect包中。它可以通過調用java.lang.reflect.Method類下的invoke(對象名,實參),形式調用某個函數,這里并不需要聲明返回值,這一切交給JVM完成。它返回的值也是唯一確定的。
       動態修改數據成員時,首先調用Class的getField()并指定field名稱。獲得特定的Field object之后便可直接調用Field的get()和set().

       以下代碼除了動態調用函數和動態修改數據成員外,實現了全部本文提到的內容,并在jdk1.5中運行通過。
    import java.lang.reflect.*;
    class ReflectTest
    {
     public static void main(String[] args)
     {
      if(args.length!=0)
      {
         Class flag=null;
         try
         {
          flag=Class.forName(args[0]);
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         Constructor[] cons=null;
         try
         {
          cons=flag.getDeclaredConstructors();
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         Method[]  meth=null;
         try
         {
          meth=flag.getDeclaredMethods();         
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         for(int i=0;i<cons.length;i++)     
         {
          System.out.println(cons[i].getName()); 
         }
         for(int i=0;i<meth.length;i++)
         {
          System.out.println(meth[i].getName());
         }
         System.out.println("---------------------------");
         Object o1=null;
         try
         {
          o1=flag.newInstance();
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         System.out.println(o1.toString());
         Class[] parameters=new Class[]{String.class};
         Constructor constr=null;
         try
         {
          constr=flag.getConstructor(parameters);
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         Object o2=null;
         Object[] o3=new Object[]{"HongMei"};
         try
         {
          o2=constr.newInstance(o3);
         }
         catch(Exception e)
         {
          e.printStackTrace();
         }
         System.out.println(o2);
      }                                        
      else
      {
        System.out.println("We cant got parameter");
      }     
     }
    }

    class Cigarette
    {
     static
     {
      System.out.println("Class Cigarette is loaded now");
     }
     Cigarette()
     {
     }
     public Cigarette(String str)
     {
      this.logo=str;
     }
     public void smoke()
     {
      System.out.println("smoke feels good");
     }
     public void lighterType(String type)
     {
      System.out.println(type);
     }
     String logo;
     public String toString()
     {
      return "Cigarette type is "+logo;
     }



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1746387

    posted on 2007-08-31 10:20 fly 閱讀(270) 評論(0)  編輯  收藏 所屬分類: java學習
    主站蜘蛛池模板: v片免费在线观看| 国产成人精品免费视频大| 精品国产_亚洲人成在线高清| 精品一区二区三区免费视频| 国产精品久久久亚洲| 黄页免费的网站勿入免费直接进入| 亚洲日本天堂在线| 在线观看午夜亚洲一区| 免费在线观看h片| 七次郎成人免费线路视频| 亚洲网红精品大秀在线观看| 午夜dj在线观看免费视频| 中文字幕无线码免费人妻| 亚洲天堂2016| 亚洲啪啪综合AV一区| 午夜爱爱免费视频| 暖暖免费日本在线中文| 久久水蜜桃亚洲AV无码精品| 亚洲AV无码久久精品成人| 国产区卡一卡二卡三乱码免费| 久久午夜羞羞影院免费观看| 蜜臀亚洲AV无码精品国产午夜.| 亚洲AV无码1区2区久久| 精品免费国产一区二区| 最近中文字幕免费2019| 一级做a毛片免费视频| 亚洲国产视频久久| 亚洲白色白色永久观看| 久久激情亚洲精品无码?V| 日韩在线免费播放| 最近的中文字幕大全免费8| 国产99精品一区二区三区免费| 日韩亚洲国产高清免费视频| 99久久亚洲精品无码毛片| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲综合免费视频| 亚洲第一AAAAA片| 亚洲精品老司机在线观看| 浮力影院第一页小视频国产在线观看免费 | 97se亚洲综合在线| 久久91亚洲人成电影网站|