Java 框架技術(shù)基礎(chǔ)---反射

Class 類(lèi)的使用

在 Java 面向?qū)ο蟮氖澜缋?萬(wàn)事萬(wàn)物皆對(duì)象惩淳!

  • 但是注意 Java 語(yǔ)言中惫撰,靜態(tài)成員然眼、普通數(shù)據(jù)類(lèi)型都不是對(duì)象(封裝類(lèi)彌補(bǔ)了普通數(shù)據(jù)類(lèi)型的不足)
  • 我們所編寫(xiě)的每一個(gè)類(lèi)都是對(duì)象甘邀,類(lèi)是 java.lang.Class 類(lèi)的實(shí)例對(duì)象。 There is a class named Class 即這里有一個(gè)名稱(chēng)為 Class 的類(lèi)昔字,我們所寫(xiě)的每一個(gè)對(duì)象所屬的類(lèi)都是它的實(shí)例

Class 類(lèi)的實(shí)例對(duì)象如何獲缺邸?

有以下代碼中的三種方式:

package com.fy.reflect;

public class Test01 {

    public static void main(String[] args) throws ClassNotFoundException {
        // 類(lèi)  A 的實(shí)例對(duì)象如何表示
        A a = new A();
        /* 類(lèi) A 也是 Class 類(lèi)一個(gè)實(shí)例對(duì)象,因?yàn)槿魏我粋€(gè)類(lèi)都是  Class 類(lèi)的實(shí)例對(duì)象螃宙,
         * 官網(wǎng)稱(chēng)之為類(lèi)類(lèi)型蛮瞄,有如下三種表示方法
        */
        // 第一種表示方法:任何一個(gè)類(lèi)都有一個(gè)隱藏的靜態(tài)成員方法去獲取 Class 實(shí)例
        Class c1 = A.class;
        // 第二種表示方法:利用某一個(gè)類(lèi)的對(duì)象的  getClass()方法
        Class c2 = a.getClass();
        // Class 動(dòng)態(tài)加載一個(gè)類(lèi)
        Class c3 = Class.forName("com.fy.reflect.A");
        
        // 一個(gè)類(lèi)只可能是 Class 類(lèi)的一個(gè)實(shí)例對(duì)象,所以下面的輸出都為 true
        System.out.println(c1 == c2); //輸出  true
        System.out.println(c1 == c3); //輸出  true
    }
}
class A{
    
}

如何理解動(dòng)態(tài)加載類(lèi)?

Class.forName("類(lèi)的全稱(chēng)")

  • 不僅表示了類(lèi)的類(lèi)類(lèi)型谆扎,還代表了動(dòng)態(tài)加載類(lèi)
  • 一定區(qū)分編譯和運(yùn)行

如何理解編譯時(shí)刻加載類(lèi)是靜態(tài)加載類(lèi)挂捅,運(yùn)行時(shí)刻加載類(lèi)是動(dòng)態(tài)加載類(lèi)

舉個(gè)例子,我們 Java 開(kāi)發(fā)者一般選擇的 IDE 工具都是 Eclipse 或者 MyEclipse堂湖,比如以下代碼闲先,我創(chuàng)建了 Eclipse,沒(méi)創(chuàng)建 MyEclipse 類(lèi)无蜂,書(shū)寫(xiě)代碼時(shí)就會(huì)出現(xiàn)錯(cuò)誤(即編譯出錯(cuò))伺糠,導(dǎo)致程序無(wú)法運(yùn)行。也就是即使有了 Eclipse斥季,沒(méi)有 MyElicpse 也不能開(kāi)發(fā)训桶。但我們實(shí)際開(kāi)發(fā)中,只有一個(gè) IDE 工具給我們就能進(jìn)行開(kāi)發(fā)酣倾,不管有沒(méi)有另外一個(gè)舵揭。再聯(lián)想下,某個(gè)項(xiàng)目中有幾十個(gè)功能躁锡,若是某個(gè)功能有問(wèn)題其他功能就不能使用么午绳?顯然不合理。

public class JavaIDE {

    public static void main(String[] args) {
        //new 是靜態(tài)加載類(lèi)映之,在編譯時(shí)都會(huì)加載所用到的類(lèi)
        Eclipse e = new Eclipse();
        e.coding();
        MyEclipse m = new MyEclipse();
        m.coding();
    }
}
class Eclipse {
    public static void coding() {
        System.out.println("This is Eclipse");
    }
}

因此我們想到拦焚,用到某個(gè)功能就去加載某個(gè)類(lèi),即動(dòng)態(tài)加載類(lèi)杠输。
為了更好的演示效果赎败,希望大家在這里用文本編輯器編寫(xiě)代碼,在 cmd 中利用 javac 命令編譯抬伺、 java 命令運(yùn)行代碼

public class JavaIDE {

    public static void main(String[] args) throws Exception {
        // 動(dòng)態(tài)加載螟够,在運(yùn)行時(shí)加載類(lèi)
        Class c = Class.forName(args[0]);
        // 通過(guò)類(lèi)類(lèi)型,創(chuàng)建該對(duì)象
        IdeAble ia = (IdeAble)c.newInstance();
        ia.coding();
    }
}

在這里峡钓,我們通過(guò)類(lèi)類(lèi)型創(chuàng)建對(duì)象時(shí),傳統(tǒng)理念是

Eclipse e = (Eclipse)c.newInstance();

但是當(dāng)我們需要的工具是 MyEclipse 時(shí)若河,這樣則不滿(mǎn)足功能要求能岩。因此選擇一個(gè)標(biāo)準(zhǔn)接口,所有功能類(lèi)都去實(shí)現(xiàn)它萧福,創(chuàng)建對(duì)象時(shí)只需創(chuàng)建接口對(duì)象就行拉鹃。

這樣需要什么功能,就去加載某個(gè)功能類(lèi)就行。

interface IdeAble{
    public void coding();
}
class Eclipse implements IdeAble{
    public void coding() {
        System.out.println("This is Eclipse");
    }
}
class MyEclipse implements IdeAble{
    public void coding() {
        System.out.println("This is MyEclipse");
    }
}

再在cmd下膏燕,編譯 JavaIDE 和 Eclipse钥屈,在運(yùn)行。

當(dāng)我們需要使用 Eclipse 功能時(shí)再去編寫(xiě)相應(yīng)的代碼坝辫,只要滿(mǎn)足 IdeAble 接口標(biāo)準(zhǔn)就行篷就,再運(yùn)行即可


方法的反射

    //獲取類(lèi)的所有方法
    public static void getMethods(Object obj) {
        Class c = obj.getClass();
        // 獲取類(lèi)所有的方法,包括從父類(lèi)繼承而來(lái)的
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            // 獲取方法的返回類(lèi)類(lèi)型
            Class returnType = method.getReturnType();
            System.out.print(returnType.getName() + " ");
            // 獲取方法的名稱(chēng)
            System.out.print(method.getName() + "(");
            // 獲取參數(shù)類(lèi)型近忙,得到的是參數(shù)列表的類(lèi)型的類(lèi)類(lèi)型
            Class[] paramTypes = method.getParameterTypes();
            int i = 0;
            for (Class class1 : paramTypes) {
                if (i == paramTypes.length - 1) {
                    System.out.print(class1.getName());
                } else {
                    System.out.print(class1.getName() + ",");
                }
                i++;
            }
            System.out.println(")");
        }
      }

成員變量的反射

//獲取類(lèi)的所有成員屬性
    public static void getField(Object obj) {
        Class c = obj.getClass();
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
    }

構(gòu)造函數(shù)的反射

//獲取類(lèi)的所有構(gòu)造方法
    public static void getConstructor(Object obj) {
        Class c = obj.getClass();
        Constructor[] constructors= c.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.print(constructor.getName()+" (");
            Class[] conParams= constructor.getParameterTypes();
            int i=0;
            for (Class class1 : conParams) {
                if (i == conParams.length-1) {
                    System.out.print(class1.getName());
                    
                }else{
                    System.out.print(class1.getName()+",");
                }
                i++;
            }
            System.out.println(")");
        }
    }

Java類(lèi)加載機(jī)制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竭业,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子及舍,更是在濱河造成了極大的恐慌未辆,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯玛,死亡現(xiàn)場(chǎng)離奇詭異咐柜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攘残,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)拙友,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肯腕,你說(shuō)我怎么就攤上這事献宫。” “怎么了实撒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵姊途,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我知态,道長(zhǎng)捷兰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任负敏,我火速辦了婚禮贡茅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘其做。我一直安慰自己顶考,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布妖泄。 她就那樣靜靜地躺著驹沿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹈胡。 梳的紋絲不亂的頭發(fā)上渊季,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天朋蔫,我揣著相機(jī)與錄音,去河邊找鬼却汉。 笑死驯妄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的合砂。 我是一名探鬼主播青扔,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼既穆!你這毒婦竟也來(lái)了赎懦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幻工,失蹤者是張志新(化名)和其女友劉穎励两,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體囊颅,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡当悔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踢代。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盲憎。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胳挎,靈堂內(nèi)的尸體忽然破棺而出饼疙,到底是詐尸還是另有隱情,我是刑警寧澤慕爬,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布窑眯,位于F島的核電站,受9級(jí)特大地震影響医窿,放射性物質(zhì)發(fā)生泄漏磅甩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一姥卢、第九天 我趴在偏房一處隱蔽的房頂上張望卷要。 院中可真熱鬧,春花似錦独榴、人聲如沸僧叉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彪标。三九已至,卻和暖如春掷豺,著一層夾襖步出監(jiān)牢的瞬間捞烟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工当船, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留题画,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓德频,卻偏偏與公主長(zhǎng)得像苍息,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壹置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法竞思,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法钞护,繼承相關(guān)的語(yǔ)法盖喷,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,597評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評(píng)論 25 707
  • Starry9的早春悅己法則 ——能解放你不羈靈魂的难咕,唯有不安分 每個(gè)獨(dú)立的女人都有一個(gè)珠寶情結(jié)课梳,那是屬于她們的悅...
    貓貓最近嘖嘖個(gè)不停閱讀 140評(píng)論 0 0
  • 仿照https://github.com/X-Team-X/SimpleKVO寫(xiě)的,添加KVO和Notificat...
    KevinTing閱讀 3,700評(píng)論 0 4
  • 文濤兄余佃,其難得之處在于暮刃,真實(shí)。 媒體在過(guò)去本質(zhì)上爆土,很大程度都是說(shuō)政治正確椭懊、假話(huà)、套話(huà)步势、場(chǎng)面話(huà)氧猬、書(shū)面話(huà)。 所以立润,我們...
    貓黍閱讀 522評(píng)論 0 1