中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 中的注解使用方法

發布時間:2020-05-11 10:29:06 來源:億速云 閱讀:332 作者:Leah 欄目:編程語言

Java 中的注解是如何工作以及使用的?相信很多新手小白對Java 的注解的了解處于懵懂狀態,通過這篇文章的總結,希望你能收獲更多。如下資料是關于Java 中的注解的內容。

前言

自Java5.0版本引入注解之后,它就成為了Java平臺中非常重要的一部分。開發過程中,我們也時常在應用代碼中會看到諸如@Override,@Deprecated這樣的注解。

這篇文章中,我將向大家講述到底什么是注解,為什么要引入注解,注解是如何工作的,如何編寫自定義的注解(通過例子),什么情況下可以使用注解以及最新注解和ADF(應用開發框架)。這會花點兒時間,所以為自己準備一杯咖啡,讓我們來進入注解的世界吧。

什么是注解?

用一個詞就可以描述注解,那就是元數據,即一種描述數據的數據。所以,可以說注解就是源代碼的元數據。比如,下面這段代碼:

@Override
public String toString() {
    return "This is String Representation of current object.";
}

上面的代碼中,我重寫了toString()方法并使用了@Override注解。但是,即使我不使用@Override注解標記代碼,程序也能夠正常執行。那么,該注解表示什么?這么寫有什么好處嗎?事實上,@Override告訴編譯器這個方法是一個重寫方法(描述方法的元數據),如果父類中不存在該方法,編譯器便會報錯,提示該方法沒有重寫父類中的方法。
br/>@Retention(RetentionPolicy.SOURCE)<br/public @interface Override {
}

對于@Override注釋你可能有些疑問,它什么都沒做,那它是如何檢查在父類中有一個同名的函數呢。當然,不要驚訝,我是逗你玩的。@Override注解的定義不僅僅只有這么一點代碼。這部分內容很重要,我不得不再次重復:Annotations僅僅是元數據,和業務邏輯無關。
br/>當我們使用Java的標注Annotations(例如@Override)時,JVM就是一個用戶,它在字節碼層面工作。到這里,應用開發人員還不能控制也不能使用自定義的注解。因此,我們講解一下如何編寫自定義的Annotations。<br/我們來逐個講述編寫自定義Annotations的要點。上面的例子中,你看到一些注解應用在注解上。
J2SE5.0版本在 java.lang.annotation提供了四種元注解,專門注解其他的注解:

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

@Documented–一個簡單的Annotations標記注解,表示是否將注解信息添加在java文檔中。
@Retention– 定義該注解的生命周期。
RetentionPolicy.SOURCE – 在編譯階段丟棄。這些注解在編譯結束之后就不再有任何意義,所以它們不會寫入字節碼。@Override, @SuppressWarnings都屬于這類注解。
RetentionPolicy.CLASS – 在類加載的時候丟棄。在字節碼文件的處理中有用。注解默認使用這種方式。
RetentionPolicy.RUNTIME– 始終不會丟棄,運行期也保留該注解,因此可以使用反射機制讀取該注解的信息。我們自定義的注解通常使用這種方式。
@Target – 表示該注解用于什么地方。如果不明確指出,該注解可以放在任何地方。以下是一些可用的參數。需要說明的是:屬性的注解是兼容的,如果你想給7個屬性都添加注解,僅僅排除一個屬性,那么你需要在定義target包含所有的屬性。

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

@Inherited – 定義該注釋和子類的關系
那么,注解的內部到底是如何定義的呢?Annotations只支持基本類型、String及枚舉類型。注釋中所有的屬性被定義成方法,并允許提供默認值。

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

下面的例子演示了如何使用上面的注解。

@Todo(priority = Todo.Priority.MEDIUM, author = "Yashwant", status = Todo.Status.STARTED)
public void incompleteMethod1() {
//Some business logic is written
//But it’s not complete yet
}

如果注解中只有一個屬性,可以直接命名為“value”,使用時無需再標明屬性名。

@interface Author{
String value();
}
@Author("Yashwant")
public void someMethod() {
}

但目前為止一切看起來都還不錯。我們定義了自己的注解并將其應用在業務邏輯的方法上。現在我們需要寫一個用戶程序調用我們的注解。這里我們需要使用反射機制。如果你熟悉反射代碼,就會知道反射可以提供類名、方法和實例變量對象。
所有這些對象都有getAnnotation()這個方法用來返回注解信息。我們需要把這個對象轉換為我們自定義的注釋(使用 instanceOf()檢查之后),同時也可以調用自定義注釋里面的方法。看看以下的實例代碼,使用了上面的注解:

Class businessLogicClass = BusinessLogic.class;
for(Method method : businessLogicClass.getMethods()) {
  Todo todoAnnotation = (Todo)method.getAnnotation(Todo.class);
  if(todoAnnotation != null) {
    System.out.println(" Method Name : " + method.getName());
    System.out.println(" Author : " + todoAnnotation.author());
    System.out.println(" Priority : " + todoAnnotation.priority());
    System.out.println(" Status : " + todoAnnotation.status());
  }
}

注解用例

注解的功能很強大,Spring和Hebernate這些框架在日志和有效性中大量使用了注解功能。注解可以應用在使用標記接口的地方。不同的是標記接口用來定義完整的類,但你可以為單個的方法定義注釋,例如是否將一個方法暴露為服務。
在最新的servlet3.0中引入了很多新的注解,尤其是和servlet安全相關的注解。
HandlesTypes –該注解用來表示一組傳遞給ServletContainerInitializer的應用類。
HttpConstraint – 該注解代表所有HTTP方法的應用請求的安全約束,和ServletSecurity注釋中定義的HttpMethodConstraint安全約束不同。
HttpMethodConstraint – 指明不同類型請求的安全約束,和ServletSecurity 注解中描述HTTP協議方法類型的注釋不同。
MultipartConfig –該注解標注在Servlet上面,表示該Servlet希望處理的請求的 MIME 類型是 multipart/form-data。
ServletSecurity 該注解標注在Servlet繼承類上面,強制該HTTP協議請求遵循安全約束。
WebFilter – 該注解用來聲明一個Server過濾器;
WebInitParam – 該注解用來聲明Servlet或是過濾器的中的初始化參數,通常配合 @WebServlet 或者 @WebFilter 使用。
WebListener –該注解為Web應用程序上下文中不同類型的事件聲明監聽器。
WebServlet –該注解用來聲明一個Servlet的配置。

ADF (應用程序框架)和注解

現在我們開始討論文章的最后一部分了。應用程序框架,被稱為ADF,由Oracle開發用來創建Oracle融合應用。我們已經了解了注解的優缺點,也知道如何編寫自定義的注解,但我們應該將注解應用在ADF的哪部分呢?ADF是否提供了一些樸素的注解?
很好的問題,確實在ADF中大量使用注解有一些限制。之前提到的應用框架如Spring和Hibernate使用AOP(面向側面的程序設計)。在AOP中,框架提供了一種機制,在事件的預處理和后續處理中注入代碼。
例如:你有一個鉤子用來在方法執行之前和之后添加代碼,所以你可以在這些地方編寫你的用戶代碼。ADF不使用AOP。如果我們有任何注解的用例可用,我們可能需要通過繼承的方式實現。

看完上訴內容,你們掌握Java 中的注解的使用方法了嗎?如果想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

原阳县| 安远县| 历史| 当涂县| 津市市| 宁津县| 田东县| 集贤县| 贡嘎县| 铁岭市| 昌平区| 巨野县| 辽宁省| 武穴市| 乳源| 宜昌市| 庆城县| 安平县| 崇义县| 无棣县| 会东县| 肃南| 阿克苏市| 枣庄市| 古丈县| 邻水| 双鸭山市| 平邑县| 德惠市| 五寨县| 长白| 贵港市| 柳江县| 宝山区| 聂荣县| 绿春县| 永丰县| 通州区| 永修县| 华亭县| 长兴县|