1.8 自定义注解
前面我們學習了 Java 的基本注解和元注解,如果這兩種注解不能滿足你的需求,可以自定義注解。下面介紹如何自定義注解。
聲明自定義注解使用 @interface 關鍵字(interface 關鍵字前加 @ 符號)實現。定義注解與定義接口非常像,如下代碼可定義一個簡單形式的注解類型。
// 定義一個簡單的注解類型 public @interface Test { }上述代碼聲明了一個 Test 注解。默認情況下,注解可以在程序的任何地方使用,通常用于修飾類、接口、方法和變量等。
定義注解和定義類相似,注解前面的訪問修飾符和類一樣有兩種,分別是公有訪問權限(public)和默認訪問權限(默認不寫)。一個源程序文件中可以聲明多個注解,但只能有一個是公有訪問權限的注解。且源程序文件命名和公有訪問權限的注解名一致。
不包含任何成員變量的注解稱為標記注解,例如上面聲明的 Test 注解以及基本注解中的 @Override 注解都屬于標記注解。根據需要,注解中可以定義成員變量,成員變量以無形參的方法形式來聲明,其方法名和返回值定義了該成員變量的名字和類型。代碼如下所示:
public @interface MyTag {// 定義帶兩個成員變量的注解// 注解中的成員變量以方法的形式來定義String name();int age(); }以上代碼中聲明了一個 MyTag 注解,定義了兩個成員變量,分別是 name 和 age。成員變量也可以有訪問權限修飾符,但是只能有公有權限和默認權限。
如果在注解里定義了成員變量,那么使用該注解時就應該為它的成員變量指定值,如下代碼所示。
public class Test {// 使用帶成員變量的注解時,需要為成員變量賦值@MyTag(name="xx", age=6)public void info() {...}... }注解中的成員變量也可以有默認值,可使用 default 關鍵字。如下代碼定義了 @MyTag 注解,該注解里包含了 name 和 age 兩個成員變量。
public @interface MyTag {// 定義了兩個成員變量的注解// 使用default為兩個成員變量指定初始值String name() default "C語言中文網";int age() default 7; }如果為注解的成員變量指定了默認值,那么使用該注解時就可以不為這些成員變量賦值,而是直接使用默認值。
public class Test {// 使用帶成員變量的注解// MyTag注釋的成員變量有默認值,所以可以不為它的成員變量賦值@MyTagpublic void info() {...}... }當然也可以在使用 MyTag 注解時為成員變量指定值,如果為 MyTag 的成員變量指定了值,則默認值不會起作用。
根據注解是否包含成員變量,可以分為如下兩類。
總結
- 上一篇: 1.7 元注解作用及使用
- 下一篇: 1.9 通过反射获取注解信息