本篇文章幫大家學習java注解類型,包含了Java注解類型使用方法、操作技巧、實例演示和注意事項,有一定的學習價值,大家可以用來參考。
標記注解類型
標記注解類型是沒有元素的注解類型,甚至沒有默認值。標記注解由注解處理工具使用。
public @interface Marker {
}
@Marker
public class Main{
}
元注解類型
元注解類型是注解類型,用于注解其他注解類型。元注解類型是Java類庫的一部分。它們在包java.lang.annotation中聲明。
以下注解類型是元注解類型:
目標
保留
繼承
文檔記錄
可重復的
本地
目標注釋類型
目標注釋類型注釋注釋類型以設置上下文以使用注釋類型。它只有一個名為value的元素。 其值元素是java.lang.annotation.ElementType枚舉類型的數組。下表列出了ElementType枚舉中的所有常量。
常量名稱
描述
ANNOTATION_TYPE
注釋另一個注釋類型聲明,使注釋類型為元注釋。
CONSTRUCTOR
注釋構造函數。
FIELD
注釋字段和枚舉常量。
LOCAL_VARIABLE
注釋局部變量。
METHOD
注釋方法。
PACKAGE
注釋包聲明。
PARAMETER
注釋參數。
TYPE
注釋類,接口(包括注釋類型)或枚舉聲明。
TYPE_PARAMETER
在通用類,接口,方法等中注釋類型參數。
TYPE_USE
注釋所有類型的使用。
以下Version注釋類型具有目標元注釋,它指定Version注釋類型可以與只有三種類型的程序元素一起使用:任何類型(類,接口,枚舉和注釋類型),構造函數和方法。
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD })
public @interface Version {
int major();
int minor();
}
Version注釋不能用于除其Target注釋中指定的三種類型之外的任何程序元素。
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ ElementType.TYPE_USE })
@interface MyAnno {
}
@Target({ ElementType.TYPE_USE })
@interface MyAnno2 {
}
public class Main {
public void processData() throws @MyAnno Exception {
int roundedValue = (@MyAnno2 int) .02;
Main t = new @MyAnno Main();
}
}
如果不使用Target注釋類型注釋注釋類型,則注釋類型可以用作任何聲明的修飾符,但類型參數聲明除外。
保留(Retention)注釋
保留(Retention)注釋設置注釋類型的保留策略。注釋可以在三個級別保留 -
僅源代碼
僅類文件,默認行為。
類文件和運行時
保留(Retention)元注釋類型指定Java應如何保留注釋。如果注釋類型具有“僅限源代碼”保留策略,則在編譯到類文件中時將刪除其實例。如果保留策略為“僅類文件”,則其實例將保留在類文件中,但不能在運行時讀取。如果保留策略為“類文件和運行時”,則注釋實例保留在類文件中,并且它們可在運行時讀取。保留元注釋類型聲明一個名為value的元素,它是java.lang.annotation.RetentionPolicy枚舉類型。
RetentionPolicy枚舉有三個常量:SOURCE,CLASS 和 RUNTIME,它們分別用于指定僅源,僅類和類運行時的保留策略。
以下代碼在版本注釋類型上使用保留元注釋。它指定版本注釋應該在運行時可用。
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@interface Version {
int major();
int minor();
}
如果不對注釋類型使用保留元注釋,則其保留策略僅默認為類文件。則將無法在運行時讀取這些注釋。在類文件中或在運行時,局部變量聲明上的注釋永遠不可用,而不考慮注釋類型的保留策略。
繼承注釋類型
繼承注釋類型是標記元注釋類型。如果注釋類型使用Inherited元注釋注釋,則其實例將由子類聲明繼承。如果使用注釋類型注釋除類聲明以外的任何元素,它沒有任何效果。以下代碼顯示了
import java.lang.annotation.Inherited;
@interface Ann2 {
int id();
}
@Inherited
@interface Ann3 {
int id();
}
@Ann2(id = 1)
@Ann3(id = 2)
class A {
}
// Class B inherits Ann3(id=2) annotation from the class A
class B extends A {
}
文檔注釋
文檔化注釋類型是標記元注釋類型。如果注釋類型用Documented注解,Javadoc工具將為其所有實例生成文檔。
import java.lang.annotation.Documented;
@Documented
@interface Version {
int major();
int minor();
}
@Version(major = 1, minor = 0)
public class Main {
}
當使用Javadoc工具為Main類生成文檔時,Main類聲明上的Version注釋也會作為文檔的一部分生成。
可重復注釋
Java 8添加了可重復元注釋類型。如果在一個單獨的代碼元素上重復使用它,注釋類型聲明必須用
Repeatable注釋類型只有一個名為value的元素,其類型是另一個注釋類型的類類型。
import java.lang.annotation.Repeatable;
@interface LogHistory {
Log[] value();
}
@Repeatable(LogHistory.class)
@interface Log {
String date();
String comments();
}
@Log(date = "01/01/2018", comments = "B")
@Log(date = "01/21/2018", comments = "A")
public class Main {
public static void process() {
}
}
本地注釋
本地(Native)注釋類型是元注釋,用于注釋可以從本地代碼引用的字段。它是一個標記注釋。