J2EE 學習

          java struts1、struts2 spring hibernate freemarker ajax fckeditor Mysql MSSQL ORACLE DB2 Websphere jboss
          隨筆 - 11, 文章 - 13, 評論 - 2, 引用 - 0
          數據加載中……

          java 反射機制

          一、什么是反射:
          反射主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。這一概念的提出很快引發了計算機科學領域關于應用反射性的研究。它首先被程序語言的設計領域所采用,并在Lisp和面向對象方面取得了成績。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射機制的語言。最近,反射機制也被應用到了視窗系統、操作系統和文件系統中。

          反射本身并不是一個新概念,盡管計算機科學賦予了反射概念新的含義。在計算機科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過采用某種機制來實現對自己行為的描述(self-representation)和監測(examination),并能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。

          二、什么是Java中的類反射:
          Reflection 是 Java 程序開發語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,并能直接操作程序的內部屬性和方法。Java 的這一能力在實際應用中用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
          Reflection 是 Java 被視為動態(或準動態)語言的關鍵,允許程序于執行期 Reflection APIs 取得任何已知名稱之 class 的內部信息,包括 package、type parameters、superclass、implemented interfaces、inner classes, outer class, fields、constructors、methods、modifiers,並可于執行期生成instances、變更 fields 內容或喚起 methods。

          三、Java類反射中所必須的類:
          Java的類反射所需要的類并不多,它們分別是:Field、Constructor、Method、Class、Object,下面我將對這些類做一個簡單的說明。
          Field類:提供有關類或接口的屬性的信息,以及對它的動態訪問權限。反射的字段可能是一個類(靜態)屬性或實例屬性,簡單的理解可以把它看成一個封裝反射類的屬性的類。
          Constructor類:提供關于類的單個構造方法的信息以及對它的訪問權限。這個類和Field類不同,Field類封裝了反射類的屬性,而Constructor類則封裝了反射類的構造方法。
          Method類:提供關于類或接口上單獨某個方法的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。 這個類不難理解,它是用來封裝反射類方法的一個類。
          Class類:類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
          Object類:每個類都使用 Object 作為超類。所有對象(包括數組)都實現這個類的方法。

          四、反射的作用
          ? 1.利用反射原理 打印類 (以String為例)
          ?? 程序如下:
          package com.test.Reflection;

          import java.lang.reflect.Constructor;
          import java.lang.reflect.Field;
          import java.lang.reflect.Method;
          import java.lang.reflect.Modifier;

          public class Reflection {
          ???? /**
          ???????? * 打印類頭部信息
          ???????? * @param className
          ???????? */
          ??????? public static void printClassInfo(String className){
          ??????????????? try {
          ??????????????????????? //獲得class對象
          ??????????????????????? Class c = Class.forName(className);
          ??????????????????????? //獲得父類的class對象
          ??????????????????????? Class super_c = c.getSuperclass();
          ??????????????????????? //打印類的修飾符,類名,父類名等信息
          ??????????????????????? System.out.print(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName());
          ??????????????????????? if(super_c!=null && !super_c.equals(Object.class)){
          ??????????????????????????????? System.out.print(" extends "+super_c.getSimpleName());
          ??????????????????????? }
          ??????????????????????? System.out.print(" {"+"\n");
          ??????????????????????? System.out.println();
          //??????????????????????? 分別調用分析屬性,構造器,方法的方法
          ??????????????????????? printField(c);
          ??????????????????????? printConstructor(c);
          ??????????????????????? printMethod(c);
          ???????????????????????
          ??????????????????????? System.out.println("}");
          ??????????????? } catch (ClassNotFoundException e) {
          ??????????????????????? e.printStackTrace();
          ??????????????? }
          ??????? }

          /**
          ???????? * 打印類的構造器信息
          ???????? * @param c
          ???????? */
          ??????? public static void printConstructor(Class c){
          ??????????????? //獲得構造器Constructor對象的數組
          ??????????????? Constructor[] csts = c.getDeclaredConstructors();
          ??????????????? //循環
          ??????????????? for(int i=0;i<csts.length;i++){
          ??????????????????????? //獲得構造器Constructor對象
          ??????????????????????? Constructor cst = csts[i];
          ??????????????????????? //獲得構造器的class對象
          ??????????????????????? Class cstClass = cst.getDeclaringClass();
          ??????????????????????? //獲得構造器的名稱
          ??????????????????????? String cstName = cstClass.getSimpleName();
          ??????????????????????? //獲得參數類型parameter的數組
          ??????????????????????? Class[] params = cst.getParameterTypes();
          ??????????????????????? System.out.print("\t"+Modifier.toString(cst.getModifiers())+" "+cstName+"(");
          ??????????????????????? //循環取出參數的類型parameter
          ??????????????????????? for(int j=0;j<params.length;j++){
          ??????????????????????????????? //如果參數個數大于0,輸出逗號
          ??????????????????????????????? if(j>0)
          ??????????????????????????????????????? System.out.print(",");
          ??????????????????????????????? //獲得參數類型的名字
          ??????????????????????????????????????? System.out.print(params[j].getSimpleName());
          ??????????????????????? }
          ??????????????????????? System.out.println("){");
          ??????????????????????? System.out.println("\t}");
          ??????????????? }
          ??????? }
          ?public static void printMethod(Class c){
          ??????????????? //獲得方法method對象的數組
          ??????????????? Method[] methods = c.getDeclaredMethods();
          ??????????????? //循環
          ??????????????? for(int i=0;i<methods.length;i++){
          ??????????????????????? //獲得一個方法對象
          ??????????????????????? Method m = methods[i];
          ??????????????????????? //獲得方法名字
          ??????????????????????? String methodName = m.getName();
          ??????????????????????? //獲得返回類型
          ??????????????????????? Class type = m.getReturnType();
          ??????????????????????? //獲得參數數組
          ??????????????????????? Class[] params = m.getParameterTypes();
          ??????????????????????? System.out.print("\t"+Modifier.toString(m.getModifiers())+" "+type.getSimpleName()+" ");
          ??????????????????????? //打印方法名字
          ??????????????????????? System.out.print(methodName+"(");
          ??????????????????????? for(int j=0;j<params.length;j++){
          ??????????????????????????????? if(j>0)
          ??????????????????????????????????????? System.out.print(",");
          ??????????????????????????????? //獲得參數名字
          ??????????????????????????????? System.out.print(params[j].getSimpleName());
          ??????????????????????? }
          ??????????????????????? System.out.println(")"+" {");
          ??????????????????????? System.out.println("\t}");
          ??????????????? }
          ??????? }
          ??? public static void main(String[] args) {
          ??????????????? printClassInfo(String.class.getName());
          ??????? }
          }
          ???上面的程序 經過的測試 是完全正確的,可以方便大家學習了解反射的原理。
          ?下面我主要介紹? 利用反射來執行類中的方法:
          ?2.? 先通過構造器構造類?再通過反射方法來執行類中方法
          例子如下:
          package com.test.Reflection;

          import java.lang.reflect.Constructor;
          import java.lang.reflect.InvocationTargetException;
          import java.lang.reflect.Method;

          public class InvokeTest {

          ??? private String info;
          ???
          ??? public void InvokeTest(){}
          ??? public void InvokeTest(String info){
          ???? this.info=info;
          ??? }
          ???
          ?public String getInfo() {
          ??return info;
          ?}
          ?public void setInfo(String info) {
          ??this.info = info;
          ?}
          ?public void sayInfo(){
          ??System.out.println("這是測試反射方法的信息");
          ?}
          ?
          ?public static void main(String[] args) {
          ??Class cl=null;
          ??Object demo=null;
          ??try {
          ???cl=Class.forName(InvokeTest.class.getName());
          ???demo=cl.newInstance();
          ???
          ???
          ???Method m1=cl.getDeclaredMethod("sayInfo");
          ???m1.invoke(demo);
          ???
          ???m1=cl.getDeclaredMethod("setInfo",String.class);
          ???m1.invoke(demo,"重新設置info中信息");
          ???
          ??? m1=cl.getDeclaredMethod("getInfo");
          ???System.out.println("這會demo中的info信息是:"+m1.invoke(demo));
          ??
          ??} catch (InvocationTargetException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??} catch (ClassNotFoundException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??} catch (SecurityException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??} catch (NoSuchMethodException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??} catch (IllegalArgumentException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??} catch (IllegalAccessException e) {
          ???// TODO Auto-generated catch block
          ???e.printStackTrace();
          ??}
          ???}

          }


          ????

          posted on 2009-07-30 22:17 李峰 閱讀(288) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 吉首市| 肇庆市| 冀州市| 来宾市| 阳江市| 赤壁市| 黎城县| 仙桃市| 博白县| 尼木县| 旬邑县| 安阳县| 团风县| 武宣县| 安塞县| 历史| 都兰县| 乌兰县| 清镇市| 贵州省| 那坡县| 平阳县| 华安县| 尚义县| 禄劝| 钟山县| 慈溪市| 南宁市| 东山县| 拉萨市| 安国市| 云梦县| 鄂尔多斯市| 阿克陶县| 都江堰市| 察雅县| 互助| 尚志市| 邵武市| 宿州市| 惠州市|