注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
通过使用注解,我们可以将这些元数据保存在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/
时间: 2024-11-03 03:46:33