您好,登錄后才能下訂單哦!
Java 中的注解是如何工作以及使用的?相信很多新手小白對Java 的注解的了解處于懵懂狀態(tài),通過這篇文章的總結,希望你能收獲更多。如下資料是關于Java 中的注解的內容。
自Java5.0版本引入注解之后,它就成為了Java平臺中非常重要的一部分。開發(fā)過程中,我們也時常在應用代碼中會看到諸如@Override,@Deprecated這樣的注解。
這篇文章中,我將向大家講述到底什么是注解,為什么要引入注解,注解是如何工作的,如何編寫自定義的注解(通過例子),什么情況下可以使用注解以及最新注解和ADF(應用開發(fā)框架)。這會花點兒時間,所以為自己準備一杯咖啡,讓我們來進入注解的世界吧。
用一個詞就可以描述注解,那就是元數據,即一種描述數據的數據。所以,可以說注解就是源代碼的元數據。比如,下面這段代碼:
@Override
public String toString() {
return "This is String Representation of current object.";
}
上面的代碼中,我重寫了toString()方法并使用了@Override注解。但是,即使我不使用@Override注解標記代碼,程序也能夠正常執(zhí)行。那么,該注解表示什么?這么寫有什么好處嗎?事實上,@Override告訴編譯器這個方法是一個重寫方法(描述方法的元數據),如果父類中不存在該方法,編譯器便會報錯,提示該方法沒有重寫父類中的方法。
br/>@Retention(RetentionPolicy.SOURCE)<br/public @interface Override {
}
對于@Override注釋你可能有些疑問,它什么都沒做,那它是如何檢查在父類中有一個同名的函數呢。當然,不要驚訝,我是逗你玩的。@Override注解的定義不僅僅只有這么一點代碼。這部分內容很重要,我不得不再次重復:Annotations僅僅是元數據,和業(yè)務邏輯無關。
br/>當我們使用Java的標注Annotations(例如@Override)時,JVM就是一個用戶,它在字節(jié)碼層面工作。到這里,應用開發(fā)人員還不能控制也不能使用自定義的注解。因此,我們講解一下如何編寫自定義的Annotations。<br/我們來逐個講述編寫自定義Annotations的要點。上面的例子中,你看到一些注解應用在注解上。
J2SE5.0版本在 java.lang.annotation提供了四種元注解,專門注解其他的注解:
@Documented –注解是否將包含在JavaDoc中
@Retention –什么時候使用該注解
@Target? –注解用于什么地方
@Inherited – 是否允許子類繼承該注解
@Documented–一個簡單的Annotations標記注解,表示是否將注解信息添加在java文檔中。
@Retention– 定義該注解的生命周期。
RetentionPolicy.SOURCE – 在編譯階段丟棄。這些注解在編譯結束之后就不再有任何意義,所以它們不會寫入字節(jié)碼。@Override, @SuppressWarnings都屬于這類注解。
RetentionPolicy.CLASS – 在類加載的時候丟棄。在字節(jié)碼文件的處理中有用。注解默認使用這種方式。
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() {
}
但目前為止一切看起來都還不錯。我們定義了自己的注解并將其應用在業(yè)務邏輯的方法上?,F在我們需要寫一個用戶程序調用我們的注解。這里我們需要使用反射機制。如果你熟悉反射代碼,就會知道反射可以提供類名、方法和實例變量對象。
所有這些對象都有getAnnotation()這個方法用來返回注解信息。我們需要把這個對象轉換為我們自定義的注釋(使用 instanceOf()檢查之后),同時也可以調用自定義注釋里面的方法??纯匆韵碌膶嵗a,使用了上面的注解:
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應用程序上下文中不同類型的事件聲明監(jiān)聽器。
WebServlet –該注解用來聲明一個Servlet的配置。
現在我們開始討論文章的最后一部分了。應用程序框架,被稱為ADF,由Oracle開發(fā)用來創(chuàng)建Oracle融合應用。我們已經了解了注解的優(yōu)缺點,也知道如何編寫自定義的注解,但我們應該將注解應用在ADF的哪部分呢?ADF是否提供了一些樸素的注解?
很好的問題,確實在ADF中大量使用注解有一些限制。之前提到的應用框架如Spring和Hibernate使用AOP(面向側面的程序設計)。在AOP中,框架提供了一種機制,在事件的預處理和后續(xù)處理中注入代碼。
例如:你有一個鉤子用來在方法執(zhí)行之前和之后添加代碼,所以你可以在這些地方編寫你的用戶代碼。ADF不使用AOP。如果我們有任何注解的用例可用,我們可能需要通過繼承的方式實現。
看完上訴內容,你們掌握Java 中的注解的使用方法了嗎?如果想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。