歡迎光臨
每天分享高質量文章

Java帝國之風雲再起

來自:碼農翻身(微訊號: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帝國空前繁榮。

相關閱讀:

Java:一個帝國的誕生

我是一個Java Class

持久化:Java帝國反擊戰

Java帝國之訊息佇列

Java帝國之動態代理

Java註解是怎麼成功上位的

Java帝國之泛型

JDBC的誕生

JDBC後傳

一個不安分的JDBC驅動

JSP:一個裝配工的沒落

(完)


●本文編號600,以後想閱讀這篇文章直接輸入600即可

●輸入m獲取文章目錄

推薦↓↓↓

 

演演算法與資料結構

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂