摘要:注解對于代碼的運行效果沒有直接影響。主要作用提供信息給編譯器編譯器可以利用注解來探測錯誤和警告信息編譯階段時的處理軟件工具可以用來利用注解信息來生成代碼文檔或者做其它相應處理。注解超類的子類那么,也擁有注解。
簡介
注解是一系列元數據,它提供數據用來解釋程序代碼,但是注解并非是所解釋代碼本身的一部分。注解對于代碼的運行效果沒有直接影響。
主要作用定義提供信息給編譯器: 編譯器可以利用注解來探測錯誤和警告信息
編譯階段時的處理: 軟件工具可以用來利用注解信息來生成代碼、Html文檔或者做其它相應處理。
運行時的處理: 某些注解可以在程序運行的時候接受代碼的提取
注解和類、接口等是一個層次的東西,它的聲明是用@interface標識的,跟接口很像,如下所示:
public @interface Zeling { }元注解-注解的注解 @Documented
使用這個注解,可以讓注解中的元素包含到javadoc或者類似的工具上去。
// Indicates that annotations with a type are to be documented by javadoc and similar tools by default.@Target
限定運用場景,可以同時限定多個,比如說新定義一個注解,限定在類型和方法注解。
// Indicates the contexts in which an annotation type is applicable.
主要有以下幾種:
// 限定給類型注解,比如說類、接口、枚舉等 TYPE, // 限定給屬性注解 FIELD, // 限定給方法注解 METHOD, // 限定給參數注解 PARAMETER, // 限定給構造函數注解 CONSTRUCTOR, // 限定給局部變量注解 LOCAL_VARIABLE, // 限定在注解上注解 ANNOTATION_TYPE, // 限定在包上使用注解 PACKAGE@Retention
保留期,即注解可以在什么時間段上起作用。
@InheritedSOURCE 源代碼階段起作用
CLASS 到編譯階段還能起作用
RUNTIME 到運行期還能起作用
繼承注解:當一個超類使用了這個注解,然后他的子類如果沒有使用注解的話,那么子類可以繼承超類的注解。
// 注解A public @interface A {} // 超類B @A public class B {} // B的子類C public class C extends B {}
那么,C也擁有注解A。
@Repeatable可重復的,當一個注解A使用了這個可重復的注解,那么注解A可以多次注解在同一個地方。
public @interface Colors { Color[] value(); } @Repeatable(Colors.class) public @interface Color { String color() default "black"; } @Color("purple") @Color("brown") @Color("red") public class Pen {}
上面這個代碼塊就是這個注解的習慣用法,自己理解哈。
注解的屬性注解只有屬性,沒有方法。注解的屬性定義跟無形參的方法很像。
public @interface A { // String 是屬性的返回值,msg是屬性的名稱,可以用default后面跟著默認的值 String msg() default "msg"; }
使用方式
@A(msg = "zeling") public class B {}
如果注解屬性中,只有一個屬性,并且屬性的名稱為value那么可以直接在注解后面直接填值,不用寫出屬性名,如:
@C(value = "msg") //等價于 @C("msg")注解的運用
Class中有三個為注解提供的方法:
// 判斷是否使用了注解 public boolean isAnnotationPresent(Class extends Annotation> annotationClass) {} // 獲取某個注解 public A getAnnotation(Class annotationClass) {} // 獲取所有注解 public Annotation[] getAnnotations() {}
例子:
@Zeling(msg = "zeling") public class App { /** * @description TODO * @date 2018年1月31日 下午11:06:13 * @param args */ public static void main(String[] args) throws Exception { boolean flag = App.class.isAnnotationPresent(Zeling.class); if (flag) { Zeling zeling = App.class.getAnnotation(Zeling.class); System.out.println("annotation: " + zeling.msg()); } } }
結果:
annotation: zeling
PS:記得給注解Zeling的作用時段設置為RetentionPolicy.RUNTIME哦,不然你可看不到輸出的。還有就是,注解的提取是基于反射機制的,而反射是比較耗時的,所以使用注解的時候請考慮時間成本。
結語錯誤之處還請幫忙指正~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70929.html
注解 注解(一種元數據形式)提供有關不屬于程序本身的程序的數據,注解對它們注解的代碼的操作沒有直接影響。 注解有許多用途,其中包括: 編譯器的信息 — 編譯器可以使用注解來檢測錯誤或抑制警告。 編譯時和部署時處理 — 軟件工具可以處理注解信息以生成代碼、XML文件等。 運行時處理 — 可以在運行時檢查某些注解。 本課程介紹了可以使用注解的位置,以及如何應用注解,Java平臺標準版(Java S...
摘要:那到底是怎么定義的呢它還能用在什么地方是如何在編譯的時候遇到這個注解就馬上發出一個提示的呢帶著這些疑問,一步一步學習的注解。 最近在學習Spring Boot,發現真的是一個靠注解搭起來的框架,Spring從使用XML到現在使用注解,大概是終于發現絕大多數人所寫的項目,都不需要XML的松耦合,快速上線、快速丟棄、快速接手,在一切都要求快的互聯網公司里,XML這樣的松耦合浪費太多的學習成...
摘要:注解有以下幾個知識點元數據注解的分類內置注解自定義注解注解處理器本文先介紹前面個知識點元數據注解的分類內置注解自定義注解。注解相當于是一種嵌入在程序中的元數據,可以使用注解解析工具或編譯器對其進行解析,也可以指定注解在編譯期或運行期有效。 大家好,我是樂字節的小樂,上次說過了Java多態的6大特性|樂字節,接下來我們來看看Java編程里的注解。showImg(https://segme...
摘要:引言在用的時候發現能自動生成,同時帶有一些注解,這引起了我的好奇。注解來源于之類的其他語言。關閉不當的編譯器警告。允許子類繼承父類中的注解。五通過注解反射生成語句接下來,我用一個例子來解釋注解的作用。 引言 在用hibernate的時候發現idea能自動生成JavaBean,同時帶有一些注解,這引起了我的好奇。當在學習Android的時候,我發現XUtils這個工具包中的DBUtils...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(...
摘要:注解概念注解也被成為元數據為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個時刻更容易的使用這些數據。 注解 概念 注解(也被成為元數據)為我們在代碼中添加信息提供了一種形式化的方式,使我們可以在稍后的某個時刻更容易的使用這些數據。 注解是 Java 5 所引入的眾多語言變化之一: 注解使得我們可以以編譯器驗證的格式存儲程序的額外信息 注解可以生成描述符文件,甚至是...
閱讀 1637·2021-10-27 14:13
閱讀 1881·2021-10-11 10:59
閱讀 3377·2021-09-24 10:26
閱讀 1934·2019-08-30 12:48
閱讀 3045·2019-08-30 12:46
閱讀 2040·2019-08-30 11:16
閱讀 1423·2019-08-30 10:48
閱讀 2748·2019-08-29 16:54