如何查看注解實現_該怎么運用注解呢?Java團隊元老有話說

999be3cab31c1dcbbccd0ce30eca24a6.png

來源 | 異步

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

75bcecd09be28d28c64b375c2d3b5e60.png

來源于知乎

但在當下,5分鐘能看完一部電影,20分鐘能略讀《三體全集》,十天進階JAVA,并非難于登天之事。

初學者請教“竅門”,不應受斥責,將心比心,誰都不愿走彎路。但編程是一門需要解決實際問題的學問,不僅要學,更要實際操作

Java被廣泛應用于企業級產品的開發中,求職者需要豐富的實際操作經驗,想在競爭中脫穎而出,就必須提高技術深度和軟實力。

dc1e8db5c9bdc90b9dd898059aea28c5.png

你需要系統地掌握這一系列知識:注釋、類加載器、反射、代理、內部類、正則表達式、IO和NIO、Lambda表達式……然后動手,把知識應用到你Java程序上的指令欄里!不斷運行、試錯、反思。

《JAVA教程15講》作者,資深大咖郭屹,曾供職于Sun公司技術研發中心Java團隊,他勸導年輕人:

“編程,不僅僅是學,更重要的是做。說到底它是一個手藝活。曾經有好些入門的年輕人問我如何編得一手好程序?我的回答總是‘無他無他,惟手熟爾’。”

異步君不鼓勵大家過分尋求“捷徑“,但站在巨人的肩膀上,無疑能看的更遠。因此,大家需要通過模仿《Java編程十五講》中的程序實例,來提升能力!

9b12322025a4c6105195f2efa03bc6f4.png

大神重視細節,例如注解,很多人認為它無足輕重,但在郭屹眼中,注解與注釋不可混為一談,注解會影響程序的運行,必須被慎重對待。他是怎樣靈活運用注解的呢?一起來看!

注解

1、講解意義

在編Java程序的時候,我們經常會碰到注解。

@Override 我們在寫子類繼承父類的時候,會經常用到這個注解。它告訴編譯器這個方法是要覆蓋父類的方法的。

@WebServlet("/myservlet") 在進行Web程序開發的時候,我們用這個注解表示這個類是一個servlet。Web容器會識別這個注解,在運行的時候調用它。

很多人說注解是注釋,初看起來有一點像,它對程序的編寫和編譯似乎沒有什么影響,只是給人看的一個對程序的附注。從這點上,確實有一點像注釋。不過,它跟注釋不同的是,它會影響程序的運行。

ea416c0ac57ad4744a6590445471e96d.png

上面提到的@Override,如果實現的時候沒有覆蓋父類的方法,編譯器會給出錯誤提示;再比如,上面的@WebServlet,如果沒有這個注解,程序是運行不起來的。

由此看來,注解并不是注釋,注釋是給人看的,并不影響程序的編譯和運行時候的行為。注解其實不是給人看的,那么它是給誰看的呢?

它被設計出來,是用于給另外的程序看的,比如編譯器,比如框架,比如Web容器。這些外在的程序通過某種方式查看到這些注解后,就可以采取相應的行為。

2、具體解釋

假如我們要做一個Web容器,類似于Tomcat這種的。

那么,容器啟動的時候,可以掃描全部類,找到包含@WebServlet注解的,識別它們,然后加載它們。那么,這個@WebServlet注解就是在運行時起作用的,Java里面把它的作用范圍規定為RUNTIME。

再看@Override,這個是給編譯器看的。編譯程序讀用戶程序的源代碼,識別出有@Override注解的方法,就去檢查上層父類相應方法。

23737a81f55d0f3996c2d73938dc4743.png

這個@Override注解就是在編譯的時候起作用的,編譯之后,就不存在了。Java里面把它的作用范圍規定為SOURCE。

類似的注解還有@Test,程序員寫好了程序,想交給測試框架去測試自己寫的方法,就可以用這個注解。測試框架會讀取源代碼,識別出有@Test注解的方法,然后生成測試代碼就可以進行測試了。

3、實際操作

接下來,我們自己動手做一個注解看看效果加深理解。

我們想做的例子是一個運行時框架加載別的客戶類,并運行其中的初始化方法。作為框架,我們可以提供一個@InitMethod注解給客戶程序員。客戶類代碼如下:

7b5cbc85d75cda2bf928ed8abeb8c9ae.png

客戶類程序員在init()方法上標注了@InitMethod注解,聲明這就是本類的初始化方法。框架程序利用這個注解識別它,并調用它。

接下來我們看怎么提供這個注解的實現。代碼如下:

2fe2edb3f76a44c31a45d807397cd1b7.png

第一次看到這個注解的實現的時候,人們都會大吃一驚,覺得很像是在定義一個接口。的確是很像,Java 5之后,提供了這樣的手段,讓人定義注解。上面就聲明了有一個叫InitMethod的注解,它是修飾方法的,在運行時可見。

我們作為框架程序的作者,既然提供了這個注解,就有責任實現它,代碼如下:

a9a8c77608c2620d6db207895d16a13c.png

為了從客戶類InitDemo里面讀出注解信息,需要用到反射機制。先通過Class.forName()加載類拿到Class信息;然后通過getMethods()拿到所有public的方法(包含從上層父類繼承下來的公共方法);

接下來是重點

method.isAnnotationPresent(InitMethod.class),這一行判斷一個方法是否標記為InitMethod;如果是,則創建一個對象并調用。這樣在框架中實現了對類的初始化方法進行調用。

4、技術拓展

下面介紹更多的一些特性。注解的基本定義如下:

9624fb5354580b3bf0d7d0d20ffdcabb.png

運行上面的程序,就能看到確實調用了初始化方法。我們定義的注解工作了。注解基本的使用就是這樣的,一點也不神秘。

作為學習者,我們應該怎樣學習?

第一步、最先了解的是注解的概念,學習使用現成的注解,;

第二步、接下來就要自己寫RUNTIME類型的注解,實現一些框架的效果;

第三步、就是自己寫SOURCE類型的注解,提供各種源代碼級別的工具。

學習的進路,就這么一步步深入下去。掌握了后,就有撥開叢林,見到本尊的愉悅,體會獲得知識的愉悅感。

49e161fad062db3b9aeb63483e88bb3a.png

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NXP S32K144開發(一)環境搭建和新建工程

1、首先需要安裝S32 Design Studio for ARM,在NXP官網可以搜索到,這玩意也是基于eclipse的 安裝好后就可以打開了。 2、新建工程 過程可以參考NXP官網: https://www.nxp.com/document/guide/get-started-with-the-s32k144evb:NGS-S32K144E…

首先記錄異常的根本原因

Logback日志庫的0.9.30版本帶來了一個很棒的新功能:從根(最內部)異常而不是最外部異常開始記錄堆棧跟蹤。 當然,我的興奮與我貢獻了此功能無關。 用塞西爾德米勒(Cecil B. de Mille) 的話來解釋&#xff1a…

成功醒言

成功醒言 C01 只有敢犯錯誤的人才能成事; 只有不犯同樣錯誤的人才能成大事。 C02 固執≠執著; 幻想≠希望。 固執是無目標的執著; 執著是有目標的固執。 幻想是無法兌現的希望; 希望是有望實現的幻想。 固執地執著幻想&#xf…

Android 中的 Service 全面總結

1、Service的種類 按運行地點分類: 類別區別 優點缺點 應用本地服務(Local)該服務依附在主進程上, 服務依附在主進程上而不是獨立的進程,這樣在一定程度上節約了資源,另外Local服務因為是在同一進程因此不…

python基礎學習1-三元表達式和lambda表達式

#!/usr/bin/env python # -*- coding:utf-8 -*- 三元運算 if else 的簡寫name "alex" if 11 else "SB" #如果條件成立 賦alex 否則 賦SB print(name)#--------------lambda表達式 f2 lambda a1,a2:a1a2100 #等價 下邊函數定義 def f1(a1,a2): return …

怎么讓存儲過程通用化_怎么做分布式存儲的面試?

cholerae 大神已經做了詳細回答,http://zenlife.tk/interview-for-distributed-storage.md寫于幾年前,內容有點稚嫩,WAL辨識度很高, 其他問題一般.CAP不會再問了,專業的存儲文獻中很少(幾乎不)提及CAP或PACELC, 這個詞用于市場和銷…

Java EE中的配置管理

我嘗試配置管理在云計算中具有很多相關性 爭論 較早。 實際上,我大膽地宣稱配置管理是任何認真嘗試從軟件中節省幾美元的基石。 那么什么是配置管理及其主要目標? 在不使事情變得過于復雜的情況下,我認為接下來的兩個目標與事實相差不遠。 以…

十年總結,一個JAVA人的十年人生路

十年總結-開篇:歇一歇,才能走的更遠經常見壇子里有人問,學習java該如何入手,或者是該學java還是學XX語言。我一直覺得,編程跟語言關系不大,重點是要有解決問題的思路。學習一門語言,其實只是尋求…

(四)Qt實現自定義模型基于QAbstractTableModel (一般)

Qt實現自定義模型基于QAbstractTableModel 兩個例子 例子1代碼 Main.cpp #include <QtGui>#include "currencymodel.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);//數據源QMap<QString, double> currencyMap;currencyMap.insert(…

pt-query-digest使用介紹【轉】

本文來自&#xff1a;http://isadba.com/?p651 一、pt-query-digest參數介紹. pt-query-digest --useranemometer --passwordanemometerpass --review h192.168.11.28,Dslow_query_log,tglobal_query_review \--history h192.168.11.28,Dslow_query_log,tglobal_query_re…

python代碼模板_python 代碼模板

python中的Module是比較重要的概念。常見的情況是&#xff0c;事先寫好一個.py文 件&#xff0c;在另一個文件中需要import時&#xff0c;將事先寫好的.py文件拷貝 到當前目錄&#xff0c;或者是在sys.path中增加事先寫好的.py文件所在的目錄&#xff0c;然后import。這樣的做法…

Java并發教程–重入鎖

Java的synced關鍵字是一個很棒的工具–它使我們能夠以一種簡單可靠的方式來同步對關鍵部分的訪問&#xff0c;而且也不難理解。 但是有時我們需要對同步進行更多控制。 我們要么需要分別控制訪問類型&#xff08;讀取和寫入&#xff09;&#xff0c;要么使用起來很麻煩&#xf…

找出互聯網類似以下圖的實例

轉載于:https://www.cnblogs.com/sghcjy/p/4978851.html

python比較運算符重載_python運算符重載

1、打印操作會首先嘗試__str__和str內置函數&#xff0c;他通常返回一個用戶友好顯示。__repr__用于所有其他環境&#xff0c;用于交互式模式下提示回應以及repr函數&#xff0c;如果沒有使用__str__&#xff0c;則會使用print和str。它通常返回一個編碼字符串&#xff0c;可以…

使用Spring MVC開發Restful Web服務

REST簡介 摘自Wikipedia&#xff1a; REST風格的體系結構由客戶端和服務器組成。 客戶端向服務器發起請求&#xff1b; 服務器處理請求并返回適當的響應。 請求和響應圍繞資源表示的傳遞而構建。 資源本質上可以是可以解決的任何連貫且有意義的概念。 正如您所閱讀的&#xff0…

深入Java核心 Java內存分配原理精講

深入Java核心 Java內存分配原理精講 Java內存分配與管理是Java的核心技術之一&#xff0c;之前我們曾介紹過Java的內存管理與內存泄露以及Java垃圾回收方面的知識&#xff0c;今天我們再次深入Java核心&#xff0c;詳細介紹一下Java在內存分配方面的知識。一般Java在內存分配時…

iOS正則表達式(親測,持續更新)

先來說說判斷方法,書寫不簡介但是好理解: -(BOOL)isRealNmaeString:(NSString *)str{NSString *pattern "填寫正則表達式";NSPredicate *pred [NSPredicate predicateWithFormat:"SELF MATCHES %", pattern];BOOL isMatch [pred evaluateWithObject:str…

python新建一個文件夾需要重新安裝模塊嗎_解決pycharm每次新建項目都要重新安裝一些第三方庫的問題...

目前有三個解決辦法&#xff0c;也是親測有用的&#xff1a;第一個方法&#xff1a;因為之前有通過pycharm的project interpreter里的號添加過一些庫&#xff0c;但添加的庫只是指定的項目用的&#xff0c;如果想要用&#xff0c;就必須用之前的項目的python解釋器&#xff0c;…

端到端測試的濫用–測試技術2

我的上一個博客是有關測試代碼方法的一系列博客中的第一篇&#xff0c;概述了使用一種非常常見的模式從數據庫檢索地址的簡單方案&#xff1a; …并描述了一種非常通用的測試技術&#xff1a; 不編寫測試 &#xff0c; 而是手動進行所有操作。 今天的博客涵蓋了另一種實踐&…

[AlwaysOn Availability Groups]排查:AG超過RPO

[AlwaysOn Availability Groups]排查&#xff1a;AG超過RPO 排查&#xff1a;AG超過RPO 在異步提交的secondary上執行了切換&#xff0c;你可能會發現數據的丟失大于RPO&#xff0c;或者在計算可以忍受的數據都是超過了RPO。 1.通常原因 1.網絡延遲太高&#xff0c;網絡吞吐量太…