註解爲咱們在代碼中添加信息提供了一種形式化的方法,使咱們能夠在稍後某個時刻很是方便地使用這些數據。java
經過使用註解,咱們能夠將這些元數據保存在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 ,這些定義註解的註解,咱們常稱爲:元註解。spa
Java中的元註解專職負責註解其餘註解的,用來標示其餘註解的適用範圍和做用域。code
Java中有四個元註解對象
元註解 | 描述 |
@Target | 表示該註解能夠用於什麼地方。可能的ElementType參數包括:blog 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 | 容許子類繼承父類中的註解 |
@併發編程網的例子
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/