注解為我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍后某個時刻非常方便地使用這些數據。
通過使用注解,我們可以將這些元數據保存在Java源代碼中,並利用annotation API為自己的注解構造處理工具。注解必須佩戴自己相應的處理器,不然注解沒有任何意思!
基本形式
在Java中定義一個注解的基本方式為:
1 import java.lang.annotation.RetentionPolicy; 2 import java.lang.annotation.Target; 3 4 /** 5 * Created by liang on 4/22/17. 6 */ 7 @Target(ElementType.TYPE) 8 @Retention(RetentionPolicy.RUNTIME) 9 @Documented 10 @Inherited 11 public @interface UseCase { 12 public int id(); 13 public String description() default "no description"; 14 }
看到沒有幾乎和接口的定義一抹一樣的!
除了在interface前多個了@外,在注解的定義本身還有幾個注解,如: @Target 和 @Retention ,這些定義注解的注解,我們常稱為:元注解。
元注解
Java中的元注解專職負責注解其他注解的,用來標示其他注解的適用范圍和作用域。
Java中有四個元注解
元注解 | 描述 |
@Target | 表示該注解可以用於什么地方。可能的ElementType參數包括: CONSTRUCTOR:構造器的生命 FIELD:域聲明(包括enum實例) LOCAL_VARIABLE:局部變量聲明 METHOD:方法聲明 PACKAGE:包聲明 PARAMETER:參數聲明 TYPE:類、接口(包括注解類型)和enum聲明 ANNOTATION_TYPE:注解聲明(與TYPE的區別?,專門用在注解上的TYPE) TYPE_PARAMETER:Java8 TYPE_USE:Java8 |
@Retention | 表示需要在什么級別保存該注解信息。可選的RetentionPolicy參數包括: SOURCE:注解將在編譯器丟棄 CLASS:注解在class文件中可用,但會被VM丟棄 RUNTIME:VM將在運行期也保留注解,因此可以通過反射機制讀取注解的信息 |
@Documented | 將此注解包含在Javadoc中 |
@Inherited | 允許子類繼承父類中的注解 |
Java8中新增的ElementType例子
@並發編程網的例子
1 package com.javacodegeeks.java8.annotations; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 import java.util.ArrayList; 8 import java.util.Collection; 9 10 public class Annotations { 11 @Retention( RetentionPolicy.RUNTIME ) 12 @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } ) 13 public @interface NonEmpty { 14 } 15 16 public static class Holder< @NonEmpty T > extends @NonEmpty Object { 17 public void method() throws @NonEmpty Exception { 18 } 19 } 20 21 @SuppressWarnings( "unused" ) 22 public static void main(String[] args) { 23 final Holder< String > holder = new @NonEmpty Holder< String >(); 24 @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>(); 25 } 26 }
注解處理器
定義了注解,必須有配套的注解處理器,通常都是通過Class對象配合反射機制來處理;網上和各種教科書中很多例子。
參考
Java編程思想
https://race604.com/annotation-processing/