安利一個優(yōu)雅的Java反射工具

Java開發(fā)中或多或少的會用到反射的方式,通常的反射方式調(diào)用如下:

    public class Person {
        private String name;

        public Person(String name) {
            this.name = name;
        }

        private void setName(String name) {
            this.name = name;
        }
    }

    public String getPersonName(Person person) {
        Class pClass = person.getClass();
        try {
            Field nameField = pClass.getDeclaredField("name");
            return (String) nameField.get(person);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
    
    public void setPersonName(Person person, String name) {
        Class pClass = person.getClass();
        try {
            Method setName;
            setName = pClass.getDeclaredMethod("setName", pClass, String.class);
            setName.setAccessible(true);
            setName.invoke(person, name);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

每一次的反射調(diào)用都讓人覺得代碼有很多冗余的地方蚁堤,我們總是希望調(diào)用的代碼顯得優(yōu)雅而簡潔。
下面就讓我們來欣賞一下優(yōu)雅的方式:

    public String getName(Person person) {
        try {
            return Reflect.on(person).get("name");
        } catch (Reflect.ReflectException e) {
            return null;
        }
    }
    
    public void setName(Person person, String name) {
        try {
            Reflect.on(person).call("setName", name);
        } catch (Reflect.ReflectException e) {
            e.printStackTrace();
        }
    }

該反射工具的源碼地址 jOOR
這個工具的封裝的功能基本覆蓋反射調(diào)用所有方式杖虾,感興趣的看官可以去看一下源碼及使用方式条辟。另外該庫還支持Java代碼的運行時編譯:

Supplier<String> supplier = Reflect.compile(
    "com.example.HelloWorld",
    "package com.example;\n" +
    "class HelloWorld implements java.util.function.Supplier<String> {\n" +
    "    public String get() {\n" +
    "        return \"Hello World!\";\n" +
    "    }\n" +
    "}\n").create().get();

// Prints "Hello World!"
System.out.println(supplier.get());

擴展

如果項目中同一種反射的調(diào)用次數(shù)比較頻繁的情況下,可以做緩存處理胳施,避免每次都直接反射屬性或者方法:

    //緩存ClassName對應的Class
    private static ConcurrentHashMap<String, Class> classCache;
    //緩存屬性值
    private static ConcurrentHashMap<String, Field> fieldCache;
    //緩存方法
    private static ConcurrentHashMap<String, Method> methodCache;

    static {
        classCache = new ConcurrentHashMap<>();
        fieldCache = new ConcurrentHashMap<>();
        methodCache = new ConcurrentHashMap<>();
    }
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溯祸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舞肆,更是在濱河造成了極大的恐慌焦辅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椿胯,死亡現(xiàn)場離奇詭異筷登,居然都是意外死亡,警方通過查閱死者的電腦和手機哩盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門前方,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廉油,你說我怎么就攤上這事惠险。” “怎么了抒线?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵班巩,是天一觀的道長。 經(jīng)常有香客問我嘶炭,道長抱慌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任眨猎,我火速辦了婚禮抑进,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘睡陪。我一直安慰自己寺渗,他們只是感情好夕凝,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著户秤,像睡著了一般码秉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸡号,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天转砖,我揣著相機與錄音,去河邊找鬼鲸伴。 笑死府蔗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汞窗。 我是一名探鬼主播姓赤,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仲吏!你這毒婦竟也來了不铆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤裹唆,失蹤者是張志新(化名)和其女友劉穎誓斥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许帐,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡劳坑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了成畦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片距芬。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖循帐,靈堂內(nèi)的尸體忽然破棺而出框仔,到底是詐尸還是另有隱情,我是刑警寧澤惧浴,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布存和,位于F島的核電站,受9級特大地震影響衷旅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纵朋,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一柿顶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧操软,春花似錦嘁锯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝗羊。三九已至,卻和暖如春仁锯,著一層夾襖步出監(jiān)牢的瞬間耀找,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工业崖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留野芒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓双炕,卻偏偏與公主長得像狞悲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妇斤,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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