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 ,這些定義注解的注解,我們常稱為:元注解。

元注解

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/

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM