Java註解用法

Java註解用法

註解元素的提供值必須是編譯時常量表達式,不能使用null作爲註解中任何類型元素的值。

基本類型

註解類型中的元素的數據類型可以是任何基本數據類型:byteshortintlongfloatdoublebooleanchar

Version註釋類型聲明兩個元素:majorminor,並且都是int數據類型。

以下代碼聲明瞭註解類型:

public @interface MyAnnotation {
  byte a();

  short b();

  int c();

  long d();

  float e();

  double f();

  boolean g();

  char h();
}
@MyAnnotation(a=1, b=2,  c=3,  d=4,  e=12.34F, f=1.89, g=true, h='Y')

可以使用編譯時常量表達式來指定註解元素的值。以下兩個版本註釋實例有效的:

@Version(major=2+1, minor=(int)13.2)
@Version(major=3, minor=13)

字符串類型

可以在註釋類型中使用String類型的元素。以下代碼定義了名爲Name的註解類型。 它有兩個元素:firstlast,它們都是String類型。

public @interface Name  { 
   String first(); 
   String last();
}

@Name(first="Tom", last="Smith")
public class NameTest {
    @Name(first="Jack", last="Iaan")
    public void  aMethod()   {
    }
}

String類型的元素的值表達式中使用字符串連接+運算符是有效的。

@Name(first="Ja" + "ck", last="Ia" + "an")

Class類型

以下代碼顯示如何使用Class類型作爲註解值。

import java.io.IOException;

@interface MyAnnotation {
  Class<? extends Throwable> willThrow() default java.lang.Throwable.class;
}

public class Main {
  @MyAnnotation(willThrow = IOException.class)
  public static void testCase1() {
    // Code goes here
  }

  @MyAnnotation()
  public static void testCase2() {
  }
}

枚舉類型

註解可以具有枚舉類型的元素。

enum Level {
  PENDING, FAILED, PASSED;
}

@interface Review {
  Level status() default Level.PENDING;

  String comments() default "";
}

@Review(status = Level.PASSED)
public class Main {

}

註解類型

可以使用註解類型作爲另一個註解類型的聲明內的元素的類型。要爲註解類型的元素提供值,請使用用於創建註解類型實例的語法。

@interface Name {
  String first();

  String last();
}

@interface Version {
  int major();

  int minor() default 0; // zero as default value for minor
}

@interface Description {
  Name name();

  Version version();

  String comments() default "";
}

@Description(name = @Name(first = "Tom", last = "Smith"), version = @Version(major = 1, minor = 2), comments = "Just a  test class")
public class Main {

}

註解可以具有數組類型的元素。數組類型可以是以下類型之一:

  • 原始類型
  • java.lang.String類型
  • java.lang.Class類型
  • 枚舉類型
  • 註解類型

需要在大括號中指定數組元素的值。數組的元素由逗號分隔。

@interface ItemList {
  String[] items();
}

@ItemList(items = { "A", "B" })
public class Main {

}

如果數組中只有一個元素,則允許省略括號。

@ToDo(items={"A"})
@ToDo(items="A")

傳遞一個空數組

@ToDo(items={})

速記註解語法

假設有一個註釋類型如下。

public  @interface Enabled  {
    boolean status() default true;
}

要使用帶有默認值的Enabled註解類型註釋程序元素,可以使用[@Enabled](https://github.com/Enabled "@Enabled")()語法。
不需要爲status元素指定值,因爲它具有默認值。可以進一步省略括號。

@Enabled
public class Main {

}

@Enabled()
public class Main {

}

只有一個元素的註解類型有速記語法。如果註釋類型只有一個具有命名值的元素,可以省略name = value對中的名稱。以下代碼聲明瞭 Company 註解類型,它只有一個名爲value的元素:

public  @interface Company  {
    String value(); 
}

當使用 Company 註釋時,可以省略name = value對的名稱。

@Company(value="Inc.")
public class Test   {
}

變成 -

@Company("Inc.")
public class Test   {
}

以下代碼顯示瞭如果元素數據類型是數組,如何使用縮寫。

public  @interface Item   {
    String[] value();
}

@Item({"A", "B"})
public class Test   {
}

如果在數組註釋類型中只指定一個元素,可以進一步省略括號。

@Item("A")
public class Test   {
}

如果在使用註釋時只提供一個值,則元素的名稱爲假設那個值。