Java中的元註解

註解爲咱們在代碼中添加信息提供了一種形式化的方法,使咱們能夠在稍後某個時刻很是方便地使用這些數據。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 容許子類繼承父類中的註解

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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/

http://ifeve.com/java-8-features-tutorial/

http://www.infoq.com/cn/articles/Type-Annotations-in-Java-8

相關文章
相關標籤/搜索