
來源 | 異步
15講能學好誕生24年的JAVA嗎?你當然會感到懷疑,眾所周知,在技術向的IT論壇上,“如何在十天之內快速掌握好Java?”這類問題,往往會招來嘲笑。

來源于知乎
但在當下,5分鐘能看完一部電影,20分鐘能略讀《三體全集》,十天進階JAVA,并非難于登天之事。
初學者請教“竅門”,不應受斥責,將心比心,誰都不愿走彎路。但編程是一門需要解決實際問題的學問,不僅要學,更要實際操作。
Java被廣泛應用于企業級產品的開發中,求職者需要豐富的實際操作經驗,想在競爭中脫穎而出,就必須提高技術深度和軟實力。

你需要系統地掌握這一系列知識:注釋、類加載器、反射、代理、內部類、正則表達式、IO和NIO、Lambda表達式……然后動手,把知識應用到你Java程序上的指令欄里!不斷運行、試錯、反思。
《JAVA教程15講》作者,資深大咖郭屹,曾供職于Sun公司技術研發中心Java團隊,他勸導年輕人:
“編程,不僅僅是學,更重要的是做。說到底它是一個手藝活。曾經有好些入門的年輕人問我如何編得一手好程序?我的回答總是‘無他無他,惟手熟爾’。”
異步君不鼓勵大家過分尋求“捷徑“,但站在巨人的肩膀上,無疑能看的更遠。因此,大家需要通過模仿《Java編程十五講》中的程序實例,來提升能力!

大神重視細節,例如注解,很多人認為它無足輕重,但在郭屹眼中,注解與注釋不可混為一談,注解會影響程序的運行,必須被慎重對待。他是怎樣靈活運用注解的呢?一起來看!
注解
1、講解意義
在編Java程序的時候,我們經常會碰到注解。
@Override 我們在寫子類繼承父類的時候,會經常用到這個注解。它告訴編譯器這個方法是要覆蓋父類的方法的。
@WebServlet("/myservlet") 在進行Web程序開發的時候,我們用這個注解表示這個類是一個servlet。Web容器會識別這個注解,在運行的時候調用它。
很多人說注解是注釋,初看起來有一點像,它對程序的編寫和編譯似乎沒有什么影響,只是給人看的一個對程序的附注。從這點上,確實有一點像注釋。不過,它跟注釋不同的是,它會影響程序的運行。

上面提到的@Override,如果實現的時候沒有覆蓋父類的方法,編譯器會給出錯誤提示;再比如,上面的@WebServlet,如果沒有這個注解,程序是運行不起來的。
由此看來,注解并不是注釋,注釋是給人看的,并不影響程序的編譯和運行時候的行為。注解其實不是給人看的,那么它是給誰看的呢?
它被設計出來,是用于給另外的程序看的,比如編譯器,比如框架,比如Web容器。這些外在的程序通過某種方式查看到這些注解后,就可以采取相應的行為。
2、具體解釋
假如我們要做一個Web容器,類似于Tomcat這種的。
那么,容器啟動的時候,可以掃描全部類,找到包含@WebServlet注解的,識別它們,然后加載它們。那么,這個@WebServlet注解就是在運行時起作用的,Java里面把它的作用范圍規定為RUNTIME。
再看@Override,這個是給編譯器看的。編譯程序讀用戶程序的源代碼,識別出有@Override注解的方法,就去檢查上層父類相應方法。

這個@Override注解就是在編譯的時候起作用的,編譯之后,就不存在了。Java里面把它的作用范圍規定為SOURCE。
類似的注解還有@Test,程序員寫好了程序,想交給測試框架去測試自己寫的方法,就可以用這個注解。測試框架會讀取源代碼,識別出有@Test注解的方法,然后生成測試代碼就可以進行測試了。
3、實際操作
接下來,我們自己動手做一個注解看看效果加深理解。
我們想做的例子是一個運行時框架加載別的客戶類,并運行其中的初始化方法。作為框架,我們可以提供一個@InitMethod注解給客戶程序員。客戶類代碼如下:

客戶類程序員在init()方法上標注了@InitMethod注解,聲明這就是本類的初始化方法。框架程序利用這個注解識別它,并調用它。
接下來我們看怎么提供這個注解的實現。代碼如下:

第一次看到這個注解的實現的時候,人們都會大吃一驚,覺得很像是在定義一個接口。的確是很像,Java 5之后,提供了這樣的手段,讓人定義注解。上面就聲明了有一個叫InitMethod的注解,它是修飾方法的,在運行時可見。
我們作為框架程序的作者,既然提供了這個注解,就有責任實現它,代碼如下:

為了從客戶類InitDemo里面讀出注解信息,需要用到反射機制。先通過Class.forName()加載類拿到Class信息;然后通過getMethods()拿到所有public的方法(包含從上層父類繼承下來的公共方法);
接下來是重點:
method.isAnnotationPresent(InitMethod.class),這一行判斷一個方法是否標記為InitMethod;如果是,則創建一個對象并調用。這樣在框架中實現了對類的初始化方法進行調用。
4、技術拓展
下面介紹更多的一些特性。注解的基本定義如下:

運行上面的程序,就能看到確實調用了初始化方法。我們定義的注解工作了。注解基本的使用就是這樣的,一點也不神秘。
作為學習者,我們應該怎樣學習?
第一步、最先了解的是注解的概念,學習使用現成的注解,;
第二步、接下來就要自己寫RUNTIME類型的注解,實現一些框架的效果;
第三步、就是自己寫SOURCE類型的注解,提供各種源代碼級別的工具。
學習的進路,就這么一步步深入下去。掌握了后,就有撥開叢林,見到本尊的愉悅,體會獲得知識的愉悅感。

郭屹老師遣詞精準,善于循循善誘,在他的JAVA 教程中,實例和巧思信手拈來,能給讀者清晰的思維結構,這就是為什么,異步君如此推薦!