zoukankan      html  css  js  c++  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 ,这些定义注解的注解,我们常称为:元注解。

    元注解

    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

  • 相关阅读:
    Android studio开发找不到HttpClient问题
    Android studio开发找不到HttpClient问题
    互联网应用之传递HTTP参数
    互联网应用之传递HTTP参数
    计算机组成原理
    计算机组成原理
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[39]水仙花数
    【NYOJ】[39]水仙花数
  • 原文地址:https://www.cnblogs.com/halu126/p/6747866.html
Copyright © 2011-2022 走看看