花一杯茶的時間笆焰,學(xué)會Java反射(實用篇)

前言

之前韩脑,我寫了一篇關(guān)于java反射的使用——花一杯茶的時間氢妈,學(xué)會Java反射(基礎(chǔ)篇),今天就拿一些實例和應(yīng)用給大家看看如何在項目中用反射段多。

實例

反射可以提高代碼的擴展性允懂,低耦合,高內(nèi)聚衩匣。就拿工廠模式來說。

  1. 首先是簡單工廠模式粥航,沒有使用反射琅捏。

     /**
      * 動物接口
      * 
      * @author chenjunxu
      * 
      */
     public interface IAnimal {
         /**
          * 品種
          */
         public void kind();
     }
    
     /**
      * 貓類
      * 
      * @author chenjunxu
      * 
      */
     public class Cat implements IAnimal {
    
         @Override
         public void kind() {
             System.out.println("I am cat!");
         }
    
     }
    
     /**
      * 狗類
      * 
      * @author chenjunxu
      * 
      */
     public class Dog implements IAnimal {
    
         @Override
         public void kind() {
             System.out.println("I am dog!");
         }
    
     }
    
     /**
      * 動物工廠類
      * 
      * @author chenjunxu
      * 
      */
     public class AnimalFactory {
    
         /**
          * 根據(jù)名稱獲取動物的實例
          * 
          * @param className
          * @return
          */
         public static IAnimal chooseAnimal(String className) {
             if (className.equalsIgnoreCase("Dog")) {
                 return new Dog();
             } else if (className.equalsIgnoreCase("Cat")) {
                 return new Cat();
             }
             return null;
         }
     }
    
     /**
      * 主類
      * 
      * @author chenjunxu
      * 
      */
     public class Main {
    
         public static void main(String[] args) {
             IAnimal animal = AnimalFactory.chooseAnimal("Cat");
             if (null != animal) {
                 animal.kind();
             } else {
                 System.out.println("沒有此動物!");
             }
    
         }
     }
    

假設(shè)我們要新增一個動物:mouse递雀。那么我們需要新建一個mouse類柄延,然后在AnimalFactory工廠類中,加多一個if...else...的判斷缀程。假設(shè)需要添加十多個動物呢搜吧?大家也知道,if...else...用的越多杨凑,可能代碼的可讀性就越差滤奈,而且容易出錯。
那么能不能每次添加一個新的動物類撩满,然后不需要修改工廠類呢蜒程?答案就是反射。
接口IAnimal和類Cat伺帘、Dog昭躺、Main不改變,將工廠類修改成以下:

    /**
     * 動物工廠類
     * 
     * @author chenjunxu
     * 
     */
    public class AnimalFactory {
        
        /**
         * 根據(jù)動物類名獲取動物的實例
         * 
         * @param className(包名+類名)
         * @return
         */
        public static IAnimal chooseAnimal(String className) {
            try {
                Class<?> clazz = Class.forName(className);
                return (IAnimal) clazz.newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

只要你的參數(shù)正確(記住是包名+類名)伪嫁,就可以獲取到對應(yīng)類的實例领炫。

  1. 現(xiàn)在假設(shè)一種場景。有一個APP的通用框架张咳,可以用來做多種多樣的APP〉酆椋現(xiàn)在似舵,有一些APP需要分享功能,有一些不需要分享功能碟狞。那我們最好以插件的形式啄枕,將分享功能封裝成jar包或者library。
    分享的jar包(分享庫):

     package com.share.lib;
     /**
      * 分享庫的分享類
      * 
      * @author chenjunxu
      * 
      */
     public class ShareLib {
    
         /**
          * 顯示分享框
          * 
          * @param content
          */
         public static void showShareDialog(String content) {
             System.out.println(content);
         }
     }
    

工具類:調(diào)用分享庫ShareLib的分享方法:

    package com.share.demo;

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

    /**
     * 分享工具類
     * 
     * @author chenjunxu
     * 
     */
    public class ShareUtils {

        /**
         * 分享
         * 
         * @param content
         *            分享內(nèi)容
         */
        public static void share(String content) {
            try {
                Class<?> clazz = Class.forName("com.share.lib.ShareLib");
                Method method = clazz.getMethod("showShareDialog", String.class);
                method.invoke(null, content);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

主方法調(diào)用工具類的分享方法:

    package com.share.demo;
    /**
     * 主類
     * 
     * @author chenjunxu
     * 
     */
    public class Main {

        public static void main(String[] args) {
            ShareUtils.share("我要分享內(nèi)容族沃!");
        }
    }

若是我們不需要使用分享功能频祝,那就不需要修改工具類,直接不調(diào)用ShareUtils.share方法就行了脆淹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末常空,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盖溺,更是在濱河造成了極大的恐慌漓糙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘嘱,死亡現(xiàn)場離奇詭異昆禽,居然都是意外死亡,警方通過查閱死者的電腦和手機蝇庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門醉鳖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮内,你說我怎么就攤上這事盗棵。” “怎么了北发?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵纹因,是天一觀的道長。 經(jīng)常有香客問我琳拨,道長瞭恰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任狱庇,我火速辦了婚禮寄疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僵井。我一直安慰自己陕截,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布批什。 她就那樣靜靜地躺著农曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乳规,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天形葬,我揣著相機與錄音,去河邊找鬼暮的。 笑死笙以,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冻辩。 我是一名探鬼主播猖腕,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恨闪!你這毒婦竟也來了倘感?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤咙咽,失蹤者是張志新(化名)和其女友劉穎老玛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧敞,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜡豹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溉苛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余素。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炊昆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情威根,我是刑警寧澤凤巨,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站洛搀,受9級特大地震影響敢茁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜留美,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一彰檬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谎砾,春花似錦逢倍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春亮蒋,著一層夾襖步出監(jiān)牢的瞬間扣典,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工慎玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贮尖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓趁怔,卻偏偏與公主長得像湿硝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痕钢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理图柏,服務(wù)發(fā)現(xiàn),斷路器任连,智...
    卡卡羅2017閱讀 134,639評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蚤吹,類相關(guān)的語法,內(nèi)部類的語法随抠,繼承相關(guān)的語法裁着,異常的語法,線程的語...
    子非魚_t_閱讀 31,603評論 18 399
  • 多態(tài) 任何域的訪問操作都將有編譯器解析拱她,如果某個方法是靜態(tài)的二驰,它的行為就不具有多態(tài)性 java默認對象的銷毀順序與...
    yueyue_projects閱讀 936評論 0 1
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,377評論 0 17
  • 丁酉年秉沼、正月初五桶雀。賞蘭而歸,有感:滿目皆繁華唬复、冬草猶余香矗积。
    無聲靜候閱讀 391評論 0 2