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

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

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

    歡迎光臨郝學(xué)武的blog。

    Java反射機(jī)制

    Posted on 2012-06-12 16:26 陜西BOY 閱讀(221) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java基礎(chǔ)知識(shí)點(diǎn)
     

    Class反射對(duì)象描述類(lèi)語(yǔ)義結(jié)構(gòu),可以從Class對(duì)象中獲取構(gòu)造函數(shù)、成員變量、方法類(lèi)等類(lèi)元素的反射對(duì)象,并以編程的方式通過(guò)這些反射對(duì)象對(duì)目標(biāo)類(lèi)對(duì)象進(jìn)行操作。這些反射對(duì)象類(lèi)在java.reflect包中定義,下面是最主要的三個(gè)反射類(lèi):
    • ?  Constructor:類(lèi)的構(gòu)造函數(shù)反射類(lèi),通過(guò)Class#getConstructors()方法可以獲得類(lèi)的所有構(gòu)造函數(shù)反射對(duì)象數(shù)組。在JDK5.0中,還可以通過(guò)getConstructor(Class... parameterTypes)獲取擁有特定入?yún)⒌臉?gòu)造函數(shù)反射對(duì)象。Constructor的一個(gè)主要方法是newInstance(Object[] initargs),通過(guò)該方法可以創(chuàng)建一個(gè)對(duì)象類(lèi)的實(shí)例,相當(dāng)于new關(guān)鍵字。在JDK5.0中該方法演化為更為靈活的形式:newInstance (Object... initargs)。
    • ?  Method:類(lèi)方法的反射類(lèi),通過(guò)Class#getDeclaredMethods()方法可以獲取類(lèi)的所有方法反射類(lèi)對(duì)象數(shù)組Method[]。在JDK5.0中可以通過(guò)getDeclaredMethod(String name, Class... parameterTypes)獲取特定簽名的方法,name為方法名;Class...為方法入?yún)㈩?lèi)型列表。Method最主要的方法是invoke(Object obj, Object[] args),obj表示操作的目標(biāo)對(duì)象;args為方法入?yún)ⅲa清單3 10③處演示了這個(gè)反射類(lèi)的使用方法。在JDK 5.0中,該方法的形式調(diào)整為invoke(Object obj, Object... args)。此外,Method還有很多用于獲取類(lèi)方法更多信息的方法:       1)Class getReturnType():獲取方法的返回值類(lèi)型;
            2)Class[] getParameterTypes():獲取方法的入?yún)㈩?lèi)型數(shù)組;
            3)Class[] getExceptionTypes():獲取方法的異常類(lèi)型數(shù)組;
            4)Annotation[][] getParameterAnnotations():獲取方法的注解信息,JDK 5.0中的新方法;
    • ?  Field:類(lèi)的成員變量的反射類(lèi),通過(guò)Class#getDeclaredFields()方法可以獲取類(lèi)的成員變量反射對(duì)象數(shù)組,通過(guò)Class#getDeclaredField(String name)則可獲取某個(gè)特定名稱(chēng)的成員變量反射對(duì)象。Field類(lèi)最主要的方法是set(Object obj, Object value),obj表示操作的目標(biāo)對(duì)象,通過(guò)value為目標(biāo)對(duì)象的成員變量設(shè)置值。如果成員變量為基礎(chǔ)類(lèi)型,用戶可以使用Field類(lèi)中提供的帶類(lèi)型名的值設(shè)置方法,如setBoolean(Object obj, boolean value)、setInt(Object obj, int value)等。

    此外,Java還為包提供了Package反射類(lèi),在JDK 5.0中還為注解提供了AnnotatedElement反射類(lèi)。總之,Java的反射體系保證了可以通過(guò)程序化的方式訪問(wèn)目標(biāo)類(lèi)中所有的元素,對(duì)于private或protected的成員變量和方法,只要JVM的安全機(jī)制允許,也可以通過(guò)反射進(jìn)行調(diào)用,請(qǐng)看下面的例子:

    代碼清單3-12  PrivateCarReflect

    color變量和drive()方法都是私有的,通過(guò)類(lèi)實(shí)例變量無(wú)法在外部訪問(wèn)私有變量、調(diào)用私有方法的,但通過(guò)反射機(jī)制卻可以繞過(guò)這個(gè)限制:


    運(yùn)行該類(lèi),打印出以下信息:
    引用
    drive private car! the color is:紅色


    在訪問(wèn)private、protected成員變量和方法時(shí)必須通過(guò)setAccessible(boolean access)方法取消Java語(yǔ)言檢查,否則將拋出IllegalAccessException。如果JVM的安全管理器設(shè)置了相應(yīng)的安全機(jī)制,調(diào)用該方法將拋出SecurityException。

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


    網(wǎng)站導(dǎo)航:
     

    posts - 17, comments - 65, trackbacks - 0, articles - 28

    Copyright © 陜西BOY

    主站蜘蛛池模板: 久久久亚洲精华液精华液精华液| 三级网站免费观看| 亚洲中文字幕无码一区二区三区| 日韩a级无码免费视频| 亚洲小说图片视频| 亚洲毛片网址在线观看中文字幕| 免费av片在线观看网站| 激情综合亚洲色婷婷五月APP| 亚洲男人的天堂一区二区| 免费无码VA一区二区三区| 日韩色日韩视频亚洲网站| 内射干少妇亚洲69XXX| 免费大片在线观看网站| 18pao国产成视频永久免费| 精品女同一区二区三区免费播放 | 二区久久国产乱子伦免费精品| 麻豆亚洲AV永久无码精品久久| 四虎影视永久免费视频观看| 最近中文字幕大全中文字幕免费| 亚洲AV无码专区在线厂| 亚洲精品在线网站| 亚洲中文字幕久久精品无码APP| 国产1024精品视频专区免费| 国产日韩AV免费无码一区二区| 亚洲日韩一区二区三区| 久久av无码专区亚洲av桃花岛 | 亚洲成人一级电影| 中文字幕亚洲无线码a| 免费网站看v片在线香蕉| 亚洲成人免费网站| 黄网站免费在线观看| 免费看内射乌克兰女| 日本亚洲免费无线码| 亚洲综合激情视频| 亚洲人成网亚洲欧洲无码久久| 国产中文字幕免费| 免费在线观看的网站| 在线观看www日本免费网站| 免费成人高清在线视频| 中文字幕a∨在线乱码免费看 | 中文在线观看免费网站|