來自:碼農翻身(微訊號:coderising)
IO大臣這些年來和執行緒大臣鬥,和XML大臣爭,和JDBC大臣搶,發現爭來爭去、搶來搶去不過是皇上的棋子而已,實在是沒什麼意思。
他心灰意冷,稱病告假,賦閑在家。
如今在家裡養養花草,養養小動物,也挺悠閑的。
這一日IO大臣正在拾掇一個名貴的盆景,下人通報有鄉下親戚來訪。 IO大臣心想估計又是哪個八竿子打不著的親戚來借錢了,送幾兩銀子打發了算了。
可是下人說來者是一個小夥子,儀錶堂堂,衣帽乾凈,不是一個窮光蛋,轉念一想,反正閑著沒事,瞭解下民間疾苦還是不錯滴嘛! 於是吩咐讓他在書房召見。
小夥子一見到IO大臣,立刻迎上前去行禮,自報家門說:“大人,小人名叫李忠,也是您老老家XXXX地方的人,大人為Java帝國建了這麼多的功業,功勛卓著,家鄉人都以大人您為榮啊,已經打算為您立一個石碑了!”
IO大臣微微點頭,馬屁拍得太多了,都沒有感覺了,看到桌子上不菲的禮品,心想還是切入正題吧。
“小李,此次來京城有何貴幹?”
小李說:“小的不才,只考中了秀才,一直在老家靠寫Java程式為生,最近小人打算寫一個MVC的框架,方便家鄉的人開發Web程式,但是發現Java中缺失了一個重要的功能,進行不下去了!”
能寫框架 ? 看來這位秀才有兩把刷子。
“缺了什麼功能啊?”
“大人,我們家鄉的人在寫Web程式的時候,經常需要把一個URL和一個Java類/方法關聯起來,比如http://localhost:8080/hello, 對於/hello這個URI,大家希望由HelloWorld這個Java類來執行,對於http://localhost:8080/add, 大家希望由Calculator這個類的add()方法來執行。” 說完小李抬頭看了一眼。
IO大臣點頭表示理解。
“為了實現這樣的功能,我們得寫不少重覆的程式碼,小人就想,要不我寫個簡單的MVC框架,把HTTP請求封裝起來,透過配置檔案的方式讓大家把一個URL和Java類關聯起來,這樣就省了好多事情了。比如像下麵這樣”
IO大臣也是經歷過大風大浪的老手,他馬上就明白了,這是一個不錯的辦法啊,當你在瀏覽器中輸入http://xxxxxx/add?num1=10&num2;=20的時候, 這個框架就可以把HTTP請求封裝起來,然後讀取這個XML的配置檔案(哼,該死的XML老頭兒), 就知道由Calculator這個類來處理,可以new 出來一個Calculator的物件,呼叫add方法即可,嗯,還需要想辦法把num1,num2這樣的引數給傳入進來,最好也弄點配置…. IO大臣越想越深入。
“大人?” 小李看到IO大臣入神了,輕聲提醒。
“哦……”,IO大臣從沉思中驚醒, “後生可畏啊,小李子,你這個想法非常不錯,你剛才說Java缺少了一個什麼重要功能來著?”
“是這樣的,大人,我們不是要讀取這個XML配置檔案,然後去建立那個Calculator類的物件嗎?”
“你直接new出來不就行了嗎?”
“大人請註意,我的框架想建立這個類的實體是在執行時,不是在編譯時,我只知道類的名字,這隻是一個字串,沒法new啊!”
IO大臣立刻明白了,小李子的MVC框架是事先寫好的,事先並不知道使用者要建立一個Calculator物件,還是一個HelloWorld物件,他只知道一個字串的類名,沒法建立類的實體出來。
即使創建出這個Calculator物件,還需要從執行相關的方法,但是MVC框架只知道方法名稱,這也是個字串(“add”),怎麼去執行啊?
“那你怎麼不向當地的官府反映下? ”
“這個……”
“有話直說!”
“現在大人您不怎麼上朝,在家修身養性,可能不知道朝中局勢大變,我們家族的人,只要是和大人您有點關聯,都會受到打壓,我去官府反映了,可是被一頓棍棒給打了出來啊。”
IO大臣勃然大怒,這還了得,老夫這才休息了多久?就被人欺負成這個樣子!
冷靜下來一想,不怪別人,還是自己疏忽了。
他叫來幕僚InputReader,支開無關閑雜人等(上次的間諜事件讓人心有餘悸)。
InputReader瞭解了情況,沉思片刻說:
“概括起來有這麼幾層意思:
1.要能透過一個類的名稱(字串)來建立物件;
2.根據方法名稱(字串)來執行方法;
3.還應該透過一個類的名稱來檢視這個類有哪些欄位,哪些方法。
所有的這些都應該發生在執行時, 這種能力確實是我們帝國所欠缺的。”
小李聽到InputReader的總結,心裡非常佩服。
IO大臣說:“這其實就是程式在執行時檢視自己或他人的一個能力啊! 我們叫他反射(Reflection)怎麼樣? 對了,Python王國,Ruby王國有這樣得東西嗎?”
IO大臣這麼問,其實也是為了增加一個砝碼,人家有的東西,我們Java也要有。
“他們都是動態語言,在執行時給一個物件新增方法、修改方法都不在話下,更不用說反射了!” InputReader說道。
“那就這樣,明日早朝,我給皇上上一個奏章。爭取把這個反射給實現了!”
InputReader 看到一直以來精神萎靡的IO大臣精神抖擻,準備再戰,自己的升官夢又死灰復燃,激動萬分:“大人,我來起草奏章吧。”
IO大臣說:“嗯,你一定要把反射的API給定義好。”
“遵命!”
到了晚上,InputReader拿出了一個初步的版本:
三人一直研究到半夜,又增加了很多新的內容,例如獲取介面、獲取父類….. 總而言之,幾乎所有的資訊都可以透過反射來得到。
第二天早朝,IO大臣在XML大臣,執行緒大臣,JDBC大臣狐疑的目光中走入了大殿,心說這老頭兒怎麼又開始活躍起來了呢?
IO大臣向死對頭們不屑地瞥了一眼,便開始向皇上慷慨陳詞,陳訴反射的種種好處,順便向皇上大倒苦水,添油加醋地說自己家族的人被欺凌的經歷,還不失時機地表達了老驥伏櫪志在千里,還能再效忠陛下的決心。
皇上聽到IO大臣的遭遇,大為同情,差點就被說動了,但轉念一想,朝中各個大臣的均勢已經維持了一段時間,如果IO大臣東山再起,平衡勢必要被打破。
他狠了狠心,說道:“愛卿年事已高,就不要再折騰了,朝中任務繁忙,萬一有點閃失朕也無法向天下交代啊,還是在家中頤養天年吧!”
IO大臣心裡一陣悲苦, 完了,徹底完了,不過無論如何我得留一個後手,他說道:“陛下,這個反射的功能對框架而言意義重大,Java帝國想繁榮昌盛,也離不開各種總各樣框架的支援,另外別的王國都有這個功能,陛下不可不察。臣手下的InputReader,深謀遠慮,可以承擔此等重任。”
別的王國也有這個功能!皇上徹底被打動,看到IO大臣悲催的臉色,也有些於心不忍,他說道:“準奏,由InputReader任Reflection大臣!”
IO大臣心中一陣寬慰,他的的那些死敵們本來想反對,但是對這個所謂的反射確實不瞭解,只能聽之任之了。
三個月後,Java Reflection正式推出,可以在執行時對一個類進行各種操作:檢視欄位/方法,設定欄位/方法的許可權,建立物件,呼叫指定的方法。所有這些,都可以透過“名稱”來進行。
Java Reflection是JDK中一項非常基礎、非常重要的技術,臣民們大為喜歡,利用它實現了各種各樣的框架,如Spring,Hibernate, Struts,Java帝國空前繁榮。
相關閱讀:
(完)
●本文編號600,以後想閱讀這篇文章直接輸入600即可
●輸入m獲取文章目錄
演演算法與資料結構
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。