Java注釋提供有關代碼的信息,并且它們對所注釋的代碼沒有直接影響。 在本教程中,我們將學習Java注釋,如何編寫自定義注釋 ,注釋用法以及如何使用反射來解析注釋 。
注釋是在Java 1.5中引入的,現在它已在Hibernate, Jersey和Spring等Java框架中大量使用。 注釋是有關嵌入在程序本身中的程序的元數據。 可以通過注釋解析工具或編譯器進行解析。 我們還可以指定注釋可用性以僅編譯時間或也可以直到運行時。
在注釋之前,可以通過java注釋或javadoc獲得程序元數據,但是注釋提供的功能更多。 它不僅包含元數據,而且還可以將其提供給運行時使用,并且注釋解析器可以使用它來確定流程。 例如,在Jersey網絡服務中,我們將帶有URI字符串的PATH注釋添加到方法中,并且在運行時jersey對其進行解析,以確定要為給定URI模式調用的方法。
在Java中創建自定義注釋
創建自定義注釋與編寫接口相似,不同之處在于它的接口關鍵字以@符號為前綴。 我們可以在注解中聲明方法。 讓我們看一下注釋示例,然后我們將討論其功能。
package com.journaldev.annotations;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{String author() default 'Pankaj';String date();int revision() default 1;String comments();
}
- 注釋方法不能有參數。
- 注釋方法的返回類型僅限于原語,字符串,枚舉,注釋或它們的數組。
- 注釋方法可以具有默認值。
- 批注可以附加元批注。 元注釋用于提供有關注釋的信息。 元注釋有四種類型:
- @Documented –指示使用此注釋的元素應由javadoc和類似工具記錄。 此類型應用于注釋其注釋會影響其客戶端對已注釋元素的使用的類型的聲明。 如果類型聲明用Documented進行注釋,則其注釋將成為帶注釋元素的公共API的一部分。
- @Target –指示注釋類型適用的程序元素的種類。 一些可能的值是TYPE,METHOD,CONSTRUCTOR,FIELD等。如果沒有Target元注釋,則可以在任何程序元素上使用注釋。
- @Inherited –表示注釋類型是自動繼承的。 如果用戶在類聲明中查詢注釋類型,并且該類聲明中沒有該類型的注釋,則將自動查詢該類的超類以獲取注釋類型。 重復此過程,直到找到該類型的注釋,或到達類層次結構(對象)的頂部為止。
- @Retention –指示帶注釋類型的注釋將保留多長時間。 它采用RetentionPolicy參數,其可能值為SOURCE,CLASS和RUNTIME
Java內置注釋
Java提供了三個內置注釋。
- @Override –當我們要重寫超類的方法時,應使用此批注通知編譯器我們正在重寫方法。 因此,當刪除或更改超類方法時,編譯器將顯示錯誤消息。
- @Deprecated –當我們希望編譯器知道某個方法已被棄用時,應使用此注釋。 Java建議在javadoc中,我們應提供有關為什么不贊成使用此方法以及可以使用什么替代方法的信息。
- @SuppressWarnings –這只是告訴編譯器忽略它們產生的特定警告,例如在泛型中使用原始類型。 它的保留策略是SOURCE,并且被編譯器丟棄。
讓我們看一個Java示例,它顯示內置注釋的用法以及在上面的示例中由我們創建的自定義注釋的用法。
package com.journaldev.annotations;import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;public class AnnotationExample {public static void main(String[] args) {}@Override@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)public String toString() {return 'Overriden toString method';}@Deprecated@MethodInfo(comments = 'deprecated method', date = 'Nov 17 2012')public static void oldMethod() {System.out.println('old method, don't use it.');}@SuppressWarnings({ 'unchecked', 'deprecation' })@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 10)public static void genericsTest() throws FileNotFoundException {List l = new ArrayList();l.add('abc');oldMethod();}}
我相信示例是自我解釋,并顯示了在不同情況下使用注釋的情況。
Java注解解析
我們將使用Reflection來解析類中的Java批注。 請注意,注釋保留策略應為RUNTIME,否則其信息將在運行時不可用,我們將無法從中獲取任何數據。
package com.journaldev.annotations;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;public class AnnotationParsing {public static void main(String[] args) {try {for (Method method : AnnotationParsing.class.getClassLoader().loadClass(('com.journaldev.annotations.AnnotationExample')).getMethods()) {// checks if MethodInfo annotation is present for the methodif (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {try {// iterates all the annotations available in the methodfor (Annotation anno : method.getDeclaredAnnotations()) {System.out.println('Annotation in Method ''+ method + '' : ' + anno);}MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);if (methodAnno.revision() == 1) {System.out.println('Method with revision no 1 = '+ method);}} catch (Throwable ex) {ex.printStackTrace();}}}} catch (SecurityException | ClassNotFoundException e) {e.printStackTrace();}}}
上面程序的輸出是:
Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)
Java注釋教程就這些了,我希望您從中學到了一些東西。
參考: 帶有自定義注釋示例的Java注釋教程,以及來自JCG合作伙伴 Pankaj Kumar的《 使用反射進行解析》 ,位于Developer Recipes博客上。
翻譯自: https://www.javacodegeeks.com/2012/11/java-annotations-tutorial-with-custom-annotation.html