亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

深入理解Java高級特性——注解

2024-07-14 08:43:37
字體:
供稿:網(wǎng)友

博主在初學(xué)注解的時候看到網(wǎng)上的介紹大部分都是直接介紹用法或者功能,沒有實際的應(yīng)用場景,篇幅又很長導(dǎo)致學(xué)習(xí)的時候難以理解其意圖,而且學(xué)完就忘QAQ。本篇文章中我將結(jié)合實際的應(yīng)用場景盡可能由淺入深,平緩的介紹java注解。

java注解是jdk1.5以后新出的特性,對于它的應(yīng)用非常廣泛,我們首先來看一下注解的應(yīng)用,百度百科上這樣說:

Java,高級特性,注解

我們可以看到,注解的作用有三方面:

編寫doc文檔:這個就我們很常用的 @return 以及 @author,加了這些注解以后,就可以用jdk幫我們自動生成對應(yīng)的API文檔了

編譯檢查:這個也很常見 @Override,而且功能很強大,我將會在以后的文章中介紹

進行代碼分析:這是本篇文章的重點。這個和編譯檢查一樣也是一個強大的功能,但相比與編譯檢查由于其用到了反射,在性能上存在一些問題

后臺開發(fā)中的SSH三大框架,以及咱們安卓端的retrofit,ButterKnife,Lombok等框架和插件也是大量的用到了注解。這里我將通過手?jǐn)]一個假的ButterKnife來具體演示注解有什么用,怎么用。

我們首先來看段代碼

public class MainActivity extends AppCompatActivity {@OnClick(R.id.test_btn)void test(){ test_tv.setText("恭喜您,綁定成功了!");}@FindViewByID(R.id.test_tv)TextView test_tv;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bindView(this);}}

這是一個最基本的activity,里面有2個控件,Button和TextView

Java,高級特性,注解

在我點擊Button后TextView的文字被改變。而我所做的僅僅是ButterKnife.bindView(this)并添加2個注解而已,這樣就實現(xiàn)了控件的綁定,省去了很多與業(yè)務(wù)無關(guān)的代碼,是不是簡潔了很多。

看了注解的功能是不是很想了解它是怎么做到的,接下來我就來看看它是什么,怎么用,怎么利用

什么是注解

官方把它叫做元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。所以,可以說注解就是源代碼的元數(shù)據(jù)。用它來可以來描述、標(biāo)記我們的源代碼。

怎樣定義一個注解

以下是我上文中定義的一個 @OnClick注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface OnClick {int value() default 0;}

可見和定義一個類一樣,只是將class改為 @interface,并且頂部通過幾個原注解來說明這個注解的一些重要信息,具體如下:

J2SE5.0版本在 java.lang.annotation提供了四種元注解,專門注解其他的注解:

  1. @Documented –注解是否將包含在JavaDoc中
  2. @Retention –什么時候使用該注解
  3. @Target? –注解用于什么地方
  4. @Inherited – 是否允許子類繼承該注解

@Documented–一個簡單的Annotations標(biāo)記注解,表示是否將注解信息添加在java文檔中,一般不用管。

@Retention– 定義該注解的生命周期,很重要,必須指定,以下是3種生命周期的介紹

  1. RetentionPolicy.SOURCE – 在編譯階段丟棄。這些注解在編譯結(jié)束之后就不再有任何意義,所以它們不會寫入字節(jié)碼。@Override, @SuppressWarnings都屬于這類注解。
  2. RetentionPolicy.CLASS – 在類加載的時候丟棄。在字節(jié)碼文件的處理中有用。注解默認(rèn)使用這種方式。
  3. RetentionPolicy.RUNTIME– 始終不會丟棄,運行期也保留該注解,因此可以使用反射機制讀取該注解的信息。我們自定義的注解通常使用這種方式。

@Target – 表示該注解用于什么地方。如果不明確指出,該注解可以放在任何地方。以下是一些可用的參數(shù)。需要說明的是:屬性的注解是兼容的,如果你想給7個屬性都添加注解,僅僅排除一個屬性,那么你需要在定義target包含所有的屬性。

ElementType.TYPE:用于描述類、接口或enum聲明
ElementType.FIELD:用于描述實例變量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一個注釋
ElementType.PACKAGE 用于記錄java文件的package信息

@Inherited – 定義該注釋和子類的關(guān)系

那么注解體里的內(nèi)容有該怎樣定義

Annotations只支持基本類型、String及枚舉類型。注釋中所有的屬性被定義成方法,并允許提供默認(rèn)值。

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@interface Book{public enum Priority {LOW, MEDIUM, HIGH}String author() default "Yash";int price() default 20;Status status() default Status.NOT_STARTED;}

看看怎么用它

@Todo(priority = Todo.Priority.MEDIUM, author = "zsq", status = Todo.Status.STARTED)public void incompleteMethod1() {}

通過字段名 = 的形式給字段賦值,如果沒賦值,則使用缺省值。如果注解中只有一個屬性,可以直接命名為“value”,使用時無需再標(biāo)明屬性名,例如我定義的 @OnClick注解。

好了,花了那么多精力來認(rèn)識他,該看看該怎么來利用它了

我們定義了自己的注解并將其應(yīng)用在業(yè)務(wù)邏輯的方法上。現(xiàn)在我們需要寫一個用戶程序調(diào)用我們的注解。這里我們需要使用反射機制。如果你熟悉反射代碼,就會知道反射可以提供類名、方法和實例變量對象。所有這些對象都有g(shù)etAnnotation()這個方法用來返回注解信息。我們需要把這個對象轉(zhuǎn)換為我們自定義的注釋(使用 instanceOf()檢查之后),同時也可以調(diào)用自定義注釋里面的方法。

所有這些對象都有g(shù)etAnnotation()!

所有這些對象都有g(shù)etAnnotation()!

所有這些對象都有g(shù)etAnnotation()!

重要的API說3遍,另外用到的幾個方法也很重要,下面的代碼會演示,更多的API使用參考可以去查閱JDK文檔。

具體到我們本編文章的實例,調(diào)用注解的家伙就是我們剛剛在MainActivity里用到的 ButterKnife,我們通過設(shè)置監(jiān)聽的注解來看看它到底做了什么

public static final void bindView(final Activity activity){ traversalMethod(activity); traversalField(activity);}

在我們調(diào)用的ButterKnife.bindView(this)中我們拿到了MainActivity的實例,并且通過反射遍歷里面所有的方法:

private static void traversalMethod(final Activity activity) { Method[] methodArray = getObjectMethodArray(activity); for (final Method method:methodArray){  if(isAnnotationPresent(method)){   int viewID = getViewID(method);   setOnClickListenerForControl(activity, method, viewID);  } }}private static Method[] getObjectMethodArray(Activity activity) { return activity.getClass().getMethods();}

接著判斷方法是否被我們注解:

private static boolean isAnnotationPresent(Method method) { return method.isAnnotationPresent(OnClick.class);}

如果是我們用注解標(biāo)注的方法則通過注解獲取注解里保存的空間ID,并且通過MainActivity的實例為其設(shè)置點擊監(jiān)聽,在監(jiān)聽內(nèi)調(diào)用被注解標(biāo)注的方法。

private static int getViewID(Method method) { return method.getAnnotation(OnClick.class).value();}private static void setOnClickListenerForControl(final Activity activity, final Method method, int viewID) { activity.findViewById(viewID).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View view) {   try {    method.invoke(activity);   } catch (IllegalAccessException e) {    e.printStackTrace();   } catch (InvocationTargetException e) {    e.printStackTrace();   }  } });}

大功告成!是不是很簡單

我們用反射獲取注解的方式實現(xiàn)了ButterKnife的功能,但文章開頭說過反射的存在性能上的不足。而實際上ButterKnife本身用的也不是反射,而是用的apt工具在編譯時期就可以獲取到所有的方法、字段、以及他們的注解,從而避免了使用反射,解決了性能的問題。接下來的文章我會講解本文開頭提到的第三點,也就是ButterKnife實際使用的方法,將我們自己的ButterKnife改為ButterKnife官方的實現(xiàn)方法。

以上所述是小編給大家介紹的Java高級特性——注解詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩一区二区三区四区五区| 国内毛片毛片毛片毛片毛片| 久久精品国产第一区二区三区| 欧美成人福利在线观看| 欧美日韩中文一区| 亚洲精品喷潮一区二区三区| 国产精品久久久久久久成人午夜| 国产网站麻豆精品视频| 手机看片福利永久| 一级肉体全黄裸片| 97超超碰碰| 99精品免费在线观看| 亚洲美女喷白浆| 国产麻豆视频| 欧美理论电影在线播放| 日本不卡二区高清三区| 亚洲bt欧美bt日本bt| 久久久青草青青国产亚洲免观| 激情综合丁香| 欧美激情 亚洲a∨综合| 乱人伦中文视频在线| 自拍视频在线看| 无码aⅴ精品一区二区三区浪潮| 国产一级电影网| 高清国产福利在线观看| 免费在线观看日韩av| 国产欧美在线看| 久久免费精品日本久久中文字幕| 国产精品456露脸| 三级视频网站在线观看| 卡通动漫亚洲综合| 波多野结衣作品集| 少妇与大狼拘作爱性a| 欧美激情第99页| 米奇777在线欧美播放| 日韩中文字幕无砖| 男女男精品网站| 深夜在线视频| 天天干,夜夜爽| 在线观看av每日更新免费| 欧美成人性网| 四季久久免费一区二区三区四区| 成人婷婷网色偷偷亚洲男人的天堂| 中文字幕在线视频网站| 99精品欧美一区二区三区小说| 国产伦精品一区二区三区四区视频| 免费观看的成年网址| 欧美性活一级视频| av中文字幕在线看| 中文字幕成人精品久久不卡| 精品人妻无码一区二区三区换脸| 精品伊人久久久久7777人| 亚洲午夜av| 国产精选在线视频拍拍拍| 呦呦视频在线观看| 性欧美亚洲xxxx乳在线观看| 亚洲宅男网av| 亚欧美无遮挡hd高清在线视频| 欧美一区二区美女| 日本黄色小网站| 最新国产在线精品91尤物| 亚洲国产精品久久久久久6q| 日本边添边摸边做边爱的第三级| 亚洲视频自拍| 影音先锋在线中文字幕| 日韩中文欧美在线| 希岛爱理av免费一区二区| 操你啦视频分享| 超碰国产在线| 亚洲va欧美va人人爽成人影院| 日韩主播视频在线| 91动漫在线看| 久操视频在线免费观看| 精品综合久久久久久8888| 成人高h视频在线| 92看片淫黄大片欧美看国产片| 成人黄色小视频| 久久精品国产大片免费观看| 自拍偷拍免费精品| 国产一区二区三区免费看| 高清国语自产在线观看| 久草视频观看| 欧美著名女优| 激情五月婷婷在线| 一区二区三区在线观看免费| 亚洲午夜久久久久久久久| 亚洲免费观看| 国产精品美女久久久久久久网站| 999www人成免费视频| 中文字幕一区二区三区域| 91久久久精品| 亚洲精品美女久久久久| 九色成人国产蝌蚪91| 一区二区三区免费视频播放器| 亚洲国产毛片aaaaa无费看| 日本77777| 182在线视频观看| 一区二区三区四区中文字幕| 成人黄色电影在线| 自拍视频在线观看一区二区| 国产亚洲制服色| 欧美成人精品激情在线观看| 国产一区二区在线免费播放| 国产小黄视频| 日韩精品一区二区三区外面| 国外男同性恋在线看| 在线中文视频| 图片区小说区区亚洲五月| 国产成人在线视频观看| 亚州av一区二区| 一区二区导航| 亚洲精品一区二三区不卡| 国产jjizz一区二区三区视频| 日本阿v视频在线观看| 成人免费网站在线观看| а√天堂8资源中文在线| 特黄视频在线观看| 国产视频一区在线观看一区免费| 国产三级免费观看| 人妻无码中文字幕| 999热视频在线观看| 青青精品视频播放| 成人性教育av免费网址| av免费不卡| 91麻豆精品国产91久久久久久| 久久成人免费电影| 男女在线视频| 天天干天天干天天干天天干天天干| 亚洲午夜在线观看| 成人激情视频在线| eeuss影院www在线观看| 悠悠资源av网址| 三妻四妾的电影电视剧在线观看| 久久精品国产亚洲av高清色欲| 色播久久人人爽人人爽人人片视av| 青青青国产在线| 日韩亚洲一区在线| 男男电影完整版在线观看| 波多野结衣精品久久| 欧美xxxxxxxx| 国产美女福利视频| 2020国产在线视频| av在线天天| 91色乱码一区二区三区| 亚洲色图视频网站| 国自产精品手机在线观看视频| 日本少妇一级片| 日日噜噜噜夜夜爽爽狠狠视频| 小说区图片区色综合区| 久久久精品久久久久| 色综合天天在线| 午夜免费啪视频观看视频| 国产福利视频网站| 这里只有精品6| 欧美毛片又粗又长又大| 色综合久久中文字幕综合网| 日本在线成人| 成人淫片在线看| av久久网站| 300部国产真实乱| 国产精品一级在线观看| 国自产拍偷拍福利精品免费一| 色欧美在线观看| 国产最新网站| 11024精品一区二区三区日韩| 欧美性欧美巨大黑白大战| 日韩中文字幕视频在线| 青青视频在线免费观看| 在线免费观看a视频| 91精品国产66| 欧美激情国产精品| 蜜臀av无码一区二区三区| 欧洲一区二区视频| 免费在线观看黄网站| 国产成人在线电影| 中文字幕av一区二区三区人| 在线免费高清一区二区三区| 国产精品www994| 日韩少妇中文字幕| 欧美精品精品精品精品免费| 国产精品99久久久久久久| 一本一道久久a久久综合精品| 成人3d动漫一区二区三区91| 久久久999成人| 九色视频在线播放| 91免费黄视频| 天堂在线中文视频| 久久国产欧美日韩精品| 国产二级一片内射视频播放| 在线观看一区二区三区三州| 国产美女精品视频免费观看| 中文字幕久久亚洲| 四虎永久在线精品免费网址| 中文字幕码精品视频网站| 亚洲免费观看视频| 久久亚洲精品小早川怜子66| 成人免费福利在线| 国产精品一区二区久久| 成人免费在线网址| 日本在线高清| 欧美午夜电影在线观看| 国产一级片免费在线观看| 麻豆精品一区二区| 午夜精品久久久久久久蜜桃| 亚洲免费视频一区二区| 久久精品91久久久久久再现| 豆花视频一区| 日韩一区二区三区精品视频第3页| 在线一区日本视频| 成人乱码一区二区三区| 国产精品嫩草av| 先锋影音中文字幕| 男人晚上看的视频| 91观看网站| 国产aⅴ一区二区三区| 国产精品嫩草影院一区二区| 大美女一区二区三区| www.狠狠爱| 色婷婷国产精品久久包臀| 色婷婷综合久久久久中文字幕1| 在线观看成人免费视频| 国产精品男女猛烈高潮激情| xxxx.欧美| 国产精品97在线| 国产精品中文字幕制服诱惑| 全部毛片永久免费看| 美女性感视频久久久| 四虎在线看片| 日韩高清精品免费观看| 岛国视频一区| 加勒比av中文字幕| 在线视频一区二区三| 国产精品综合av一区二区国产馆| 亚洲精品国模| 欧美午夜春性猛交xxxx| 国产美女在线精品免费观看| 在线观看国产一区二区| 亚洲精品久久久久久久久久久| 国产女人18毛片水真多成人如厕| 久久五月情影视| 国产精品18在线| 欧美视频在线免费| 一区二区久久久久久| 国产在线视频2019最新视频| 日本电影一区二区在线观看| 国产在线精品自拍| 天天射天天综合网| 亚洲欧洲av一区二区三区久久| 国产伦精品一区二区三区| 秋霞无码一区二区| 人人爽人人爽人人片av| 亚洲三级理论片| 草草久视频在线观看电影资源| 超碰av女优在线| eeuss影院eeuss最新直达| 日本一区二区在线| sihu成人| 日韩激情在线| 日韩成人精品一区二区三区| 91xxx视频| 国产一伦一伦一伦| 黄色激情视频在线观看| 欧美裸体男粗大视频在线观看| 在线观看日韩毛片| 国产在线精品一区二区三区| 亚洲乱码精品一二三四区日韩在线| 日本一二区不卡| 一区免费视频| 一本久久精品| 日韩欧美在线123| 亚洲综合国产| www.久久热.com| 可以在线看的av| 成人av免费在线播放| 婷婷亚洲久悠悠色悠在线播放| 国产99精品在线观看| 亚洲精品国产一区二区三区| 两个人的视频www国产精品| 国产女人18毛片水18精| 欧美高清中文字幕| 久久视频在线直播| 美女www一区二区| 超碰在线观看免费版| 欧美女优在线观看| 亚洲黄色在线网站| 免费在线视频一区二区| 国产成人精品在线| 香蕉视频国产精品| 成人动漫av| 日韩欧美一二三| 欧美精品久久天天躁| 99re热这里只有精品免费视频| 亚洲日本一区二区三区在线观看| 波多野结衣在线一区二区| 久久亚洲精品小早川怜子| 国产999精品久久久久久绿帽| av一级黄色片| 最新欧美精品一区二区三区| jk漫画禁漫成人入口| 欧美与亚洲与日本直播| 性色av一区二区三区在线观看| 国产高清在线视频| 中文在线最新版地址| 杨幂一区二区三区免费看视频| 99久久99久久久精品棕色圆| 国产人成在线观看| 国产米奇在线777精品观看| 日韩性生活视频| 男人操女人的视频在线观看欧美| 中文字幕人妻丝袜乱一区三区| 四虎国产精品永久在线国在线| 无套内谢大学处破女www小说| av 日韩 人妻 黑人 综合 无码| 国产精品久久久久久婷婷天堂| 中文在线观看免费网站| 日本加勒比高清在线| 成人国产精品一区二区免费麻豆| 91免费视频网址| 国产成人高清精品免费5388| 98精品久久久久久久| 欧美狂欢多p性派对| 亚洲美女动态图120秒| 天堂免费在线视频| 亚洲娇小娇小娇小| 91国产精品视频在线观看| 超碰国产精品一区二页| 亚洲黄一区二区| 中文字幕4区|