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

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

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

    J2EE 學(xué)習(xí)

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

    java 反射機(jī)制

    一、什么是反射:
    反射主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力。這一概念的提出很快引發(fā)了計算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語言的設(shè)計領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽儭F渲蠰EAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射機(jī)制的語言。最近,反射機(jī)制也被應(yīng)用到了視窗系統(tǒng)、操作系統(tǒng)和文件系統(tǒng)中。

    反射本身并不是一個新概念,盡管計算機(jī)科學(xué)賦予了反射概念新的含義。在計算機(jī)科學(xué)領(lǐng)域,反射是指一類應(yīng)用,它們能夠自描述和自控制。也就是說,這類應(yīng)用通過采用某種機(jī)制來實(shí)現(xiàn)對自己行為的描述(self-representation)和監(jiān)測(examination),并能根據(jù)自身行為的狀態(tài)和結(jié)果,調(diào)整或修改應(yīng)用所描述行為的狀態(tài)和相關(guān)的語義。

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

    三、Java類反射中所必須的類:
    Java的類反射所需要的類并不多,它們分別是:Field、Constructor、Method、Class、Object,下面我將對這些類做一個簡單的說明。
    Field類:提供有關(guān)類或接口的屬性的信息,以及對它的動態(tài)訪問權(quán)限。反射的字段可能是一個類(靜態(tài))屬性或?qū)嵗龑傩裕唵蔚睦斫饪梢园阉闯梢粋€封裝反射類的屬性的類。
    Constructor類:提供關(guān)于類的單個構(gòu)造方法的信息以及對它的訪問權(quán)限。這個類和Field類不同,F(xiàn)ield類封裝了反射類的屬性,而Constructor類則封裝了反射類的構(gòu)造方法。
    Method類:提供關(guān)于類或接口上單獨(dú)某個方法的信息。所反映的方法可能是類方法或?qū)嵗椒ǎòǔ橄蠓椒ǎ?這個類不難理解,它是用來封裝反射類方法的一個類。
    Class類:類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數(shù)組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對象。
    Object類:每個類都使用 Object 作為超類。所有對象(包括數(shù)組)都實(shí)現(xiàn)這個類的方法。

    四、反射的作用
    ? 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();
    //??????????????????????? 分別調(diào)用分析屬性,構(gòu)造器,方法的方法
    ??????????????????????? printField(c);
    ??????????????????????? printConstructor(c);
    ??????????????????????? printMethod(c);
    ???????????????????????
    ??????????????????????? System.out.println("}");
    ??????????????? } catch (ClassNotFoundException e) {
    ??????????????????????? e.printStackTrace();
    ??????????????? }
    ??????? }

    /**
    ???????? * 打印類的構(gòu)造器信息
    ???????? * @param c
    ???????? */
    ??????? public static void printConstructor(Class c){
    ??????????????? //獲得構(gòu)造器Constructor對象的數(shù)組
    ??????????????? Constructor[] csts = c.getDeclaredConstructors();
    ??????????????? //循環(huán)
    ??????????????? for(int i=0;i<csts.length;i++){
    ??????????????????????? //獲得構(gòu)造器Constructor對象
    ??????????????????????? Constructor cst = csts[i];
    ??????????????????????? //獲得構(gòu)造器的class對象
    ??????????????????????? Class cstClass = cst.getDeclaringClass();
    ??????????????????????? //獲得構(gòu)造器的名稱
    ??????????????????????? String cstName = cstClass.getSimpleName();
    ??????????????????????? //獲得參數(shù)類型parameter的數(shù)組
    ??????????????????????? Class[] params = cst.getParameterTypes();
    ??????????????????????? System.out.print("\t"+Modifier.toString(cst.getModifiers())+" "+cstName+"(");
    ??????????????????????? //循環(huán)取出參數(shù)的類型parameter
    ??????????????????????? for(int j=0;j<params.length;j++){
    ??????????????????????????????? //如果參數(shù)個數(shù)大于0,輸出逗號
    ??????????????????????????????? if(j>0)
    ??????????????????????????????????????? System.out.print(",");
    ??????????????????????????????? //獲得參數(shù)類型的名字
    ??????????????????????????????????????? System.out.print(params[j].getSimpleName());
    ??????????????????????? }
    ??????????????????????? System.out.println("){");
    ??????????????????????? System.out.println("\t}");
    ??????????????? }
    ??????? }
    ?public static void printMethod(Class c){
    ??????????????? //獲得方法method對象的數(shù)組
    ??????????????? Method[] methods = c.getDeclaredMethods();
    ??????????????? //循環(huán)
    ??????????????? for(int i=0;i<methods.length;i++){
    ??????????????????????? //獲得一個方法對象
    ??????????????????????? Method m = methods[i];
    ??????????????????????? //獲得方法名字
    ??????????????????????? String methodName = m.getName();
    ??????????????????????? //獲得返回類型
    ??????????????????????? Class type = m.getReturnType();
    ??????????????????????? //獲得參數(shù)數(shù)組
    ??????????????????????? 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(",");
    ??????????????????????????????? //獲得參數(shù)名字
    ??????????????????????????????? System.out.print(params[j].getSimpleName());
    ??????????????????????? }
    ??????????????????????? System.out.println(")"+" {");
    ??????????????????????? System.out.println("\t}");
    ??????????????? }
    ??????? }
    ??? public static void main(String[] args) {
    ??????????????? printClassInfo(String.class.getName());
    ??????? }
    }
    ???上面的程序 經(jīng)過的測試 是完全正確的,可以方便大家學(xué)習(xí)了解反射的原理。
    ?下面我主要介紹? 利用反射來執(zhí)行類中的方法:
    ?2.? 先通過構(gòu)造器構(gòu)造類?再通過反射方法來執(zhí)行類中方法
    例子如下:
    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,"重新設(shè)置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 李峰 閱讀(289) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产亚洲AV手机在线观看| 又硬又粗又长又爽免费看| 久久99青青精品免费观看| 亚洲精品国产自在久久| 无遮挡免费一区二区三区| 亚洲AⅤ无码一区二区三区在线| 亚洲国产精品无码久久98| 日韩免费视频一区| 亚洲色大成网站www久久九| 欧洲精品免费一区二区三区| 亚洲sm另类一区二区三区| 国产乱子伦片免费观看中字| 校园亚洲春色另类小说合集| 一本色道久久88亚洲综合| 免费无码国产在线观国内自拍中文字幕| 亚洲av日韩片在线观看| 巨胸喷奶水www永久免费| 国产V亚洲V天堂无码| 亚洲电影免费在线观看| 亚洲综合色7777情网站777| 国产色爽免费视频| 亚洲AV无码国产精品色午友在线| 最近中文字幕大全免费版在线| 久久亚洲美女精品国产精品 | 又大又粗又爽a级毛片免费看| 国产精品亚洲va在线观看| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 永久免费av无码网站大全| sihu国产精品永久免费| 大学生a级毛片免费观看| 国产精品无码亚洲精品2021| 中文字幕亚洲专区| 亚洲一区免费视频| 豆国产96在线|亚洲| 亚洲欧洲国产精品香蕉网| 免费观看无遮挡www的小视频| 亚洲中文字幕久久精品蜜桃| 亚洲男人在线无码视频| 18禁美女黄网站色大片免费观看 | 三上悠亚亚洲一区高清| 亚洲一级毛片免费观看|