Java 注釋類型

2018-01-19 12:07 更新

Java面向?qū)ο笤O(shè)計(jì) - Java注釋類型

標(biāo)記注釋類型

標(biāo)記注釋類型是沒(méi)有元素的注釋類型,甚至沒(méi)有默認(rèn)值。

標(biāo)記注釋由注釋處理工具使用。

public  @interface Marker  {
}
@Marker
public class Main{

}

元注釋類型

元注釋類型是注釋類型,用于注釋其他注釋類型。

元注釋類型是Java類庫(kù)的一部分。它們?cè)诎黬ava.lang.annotation中聲明。

以下注釋類型是元注釋類型:

  • Target
  • Retention
  • Inherited
  • Documented
  • Repeatable
  • Native

Target注釋類型

目標(biāo)注釋類型注釋注釋類型以設(shè)置上下文以使用注釋類型。

它只有一個(gè)名為value的元素。其值元素是java.lang.annotation.ElementType枚舉類型的數(shù)組。

下表列出了ElementType枚舉中的所有常量。

常量名稱描述
ANNOTATION_TYPE注釋另一個(gè)注釋類型聲明。 這使得注釋類型為元注釋。
CONSTRUCTOR注釋構(gòu)造函數(shù)。
FIELD注釋字段和枚舉常量。
LOCAL_VARIABLE注釋局部變量。
METHOD注釋方法。
PACKAGE注釋包聲明。
PARAMETER注釋參數(shù)。
TYPE注釋類,接口(包括注釋類型)或枚舉聲明。
TYPE_PARAMETER在通用類,接口,方法等中注釋類型參數(shù)。
TYPE_USE注釋所有類型的使用。

以下版本注釋類型具有目標(biāo)元注釋,其指定Version注釋類型可以與僅有三種類型的程序元素一起使用:任何類型(類,接口,枚舉和注釋類型),構(gòu)造函數(shù)和方法。

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD })
public @interface Version {
  int major();

  int minor();
}

版本注釋不能用于除其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();
  }

}

如果我們不與注釋目標(biāo)注釋類型注釋類型,注釋類型可以用作任何聲明修飾符,除了一個(gè)類型參數(shù)聲明。

保留注釋

保留注釋設(shè)置注釋類型的保留策略。

注釋可以在三個(gè)級(jí)別保留。

  • 僅源代碼
  • 僅類文件。默認(rèn)行為。
  • 類文件和運(yùn)行時(shí)

保留元注釋類型指定Java應(yīng)如何保留注釋。

如果注釋類型具有“僅限源代碼”保留策略,則在編譯到類文件中時(shí)將刪除其實(shí)例。

如果保留策略是“僅類文件”,則其實(shí)例將保留在類文件中,但不能在運(yùn)行時(shí)讀取。

如果保留策略為“類文件和運(yùn)行時(shí)”,則注釋實(shí)例保留在類文件中,并且它們可在運(yùn)行時(shí)讀取。

保留元注釋類型聲明一個(gè)名為value的元素,它是java.lang的。 annotation.RetentionPolicy枚舉類型。

RetentionPolicy枚舉有三個(gè)常量SOURCE,CLASS和RUNTIME,它們分別用于指定僅源,僅類和類和運(yùn)行時(shí)的保留策略。

以下代碼在版本注釋類型上使用保留元注釋。它指定版本注釋應(yīng)該在運(yùn)行時(shí)可用。

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();
}

如果我們不對(duì)注釋類型使用保留元注釋,則其保留策略僅默認(rèn)為類文件。我們將無(wú)法在運(yùn)行時(shí)讀取這些注釋。

在類文件中或在運(yùn)行時(shí),局部變量聲明上的注釋永遠(yuǎn)不可用,而與注釋類型的保留策略無(wú)關(guān)。

繼承注釋類型

繼承的注釋類型是標(biāo)記元注釋類型。

如果注釋類型使用Inherited元注釋注釋,則其實(shí)例將由子類聲明繼承。

如果使用注釋類型注釋除類聲明以外的任何元素,它沒(méi)有任何效果。

以下代碼顯示了@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 {

}

文檔化注釋

文檔化注釋類型是標(biāo)記元注釋類型。

如果注釋類型用Documented注釋注釋,Javadoc工具將為其所有實(shí)例生成文檔。

import java.lang.annotation.Documented;

@Documented
@interface Version {
  int major();

  int minor();
}

@Version(major = 1, minor = 0)
public class Main {
}

當(dāng)使用Javadoc工具為Main類生成文檔時(shí),Main類聲明上的版本注釋也會(huì)作為文檔的一部分生成。

可重復(fù)注釋

Java 8添加了可重復(fù)元注釋類型。

注釋類型聲明必須用@Repeatable注釋注釋,如果我們?cè)谝粋€(gè)單獨(dú)的代碼元素上重復(fù)使用它。

Repeatable注釋類型只有一個(gè)名為value的元素,其類型是另一個(gè)注釋類型的類類型。

import java.lang.annotation.Repeatable;

@interface LogHistory {
  Log[] value();
}

@Repeatable(LogHistory.class)
@interface Log {
  String date();

  String comments();
}

@Log(date = "01/01/2014", comments = "B")
@Log(date = "01/21/2014", comments = "A")
public class Main {
  public static void process() {

  }
}

本機(jī)注釋

Native注釋類型是元注釋,用于注釋可以從本機(jī)代碼引用的字段。它是一個(gè)標(biāo)記注釋。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)