疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java自定义注解及注解使用


 

       java注解是指附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。其实际不会也不能影响代码的实际逻辑,仅仅起到辅助性标记的作用。而对于java的注解jdk包java.lang.annotation有详细的介绍。

  元注解是指注解的注解,JAVA JDK中提供了四种元注解,分别是:

  @Document 标明该注解将会包含至javaDoc文档中。 JDK1.5 +

  @Inherited 标明该注解可以由子类继承。 JDK1.5 +

  @Retention 标明注解的保留策略。JDK1.5 +

  JDK提供了三种保留策略,分别是:

  @Retention(RetentionPolicy.SOURCE) -- 注解只存在于源代码中,字节码Class文件中将不存在该注解。

  @Retention(RetentionPolicy.CLASS) -- 标明注解只会被编译器编译后保留在Class字节码文件中,而运行时无法获取。

  @Retention(RetentionPolicy.RUNTIME) -- 标明注解会保留在class字节码文件中,且运行时能通过反射机制获取。

  JDK源码:

  public enum RetentionPolicy {

  /**

  * Annotations are to be discarded by the compiler.

  */

  SOURCE,

  /**

  * Annotations are to be recorded in the class file by the compiler

  * but need not be retained by the VM at run time. This is the default

  * behavior.

  */

  CLASS,

  /**

  * Annotations are to be recorded in the class file by the compiler and

  * retained by the VM at run time, so they may be read reflectively.

  *

  * @see java.lang.reflect.AnnotatedElement

  */

  RUNTIME

  }

  @Target 标明注解的作用目标对象。

  其作用对象主要有:

  JDK源码

  public enum ElementType {

  /** Class, interface (including annotation type), or enum declaration */ -- 标注类,接口,注解,枚举

  TYPE,

  /** Field declaration (includes enum constants) */ --标注字段,枚举常量

  FIELD,

  /** Method declaration */ -- 标注方法

  METHOD,

  /** Parameter declaration */ -- 标注参数

  PARAMETER,

  /** Constructor declaration */--标注构造器

  CONSTRUCTOR,

  /** Local variable declaration */ -- 标注局部变量

  LOCAL_VARIABLE,

  /** Annotation type declaration */ -- 标注注解

  ANNOTATION_TYPE,

  /** Package declaration */ -- 标注包

  PACKAGE

  }

  了解到java注解的元注解后,如果需要自定义java注解,该怎么样定义?

  一:自定义注解类:@interface

  import java.lang.annotation.Documented;

  import java.lang.annotation.Inherited;

  import java.lang.annotation.Retention;

  import java.lang.annotation.RetentionPolicy;

  import java.lang.annotation.Target;

  import java.lang.annotation.ElementType;

  @Documented

  @Retention(RetentionPolicy.RUNTIME)

  @Target(value=ElementType.TYPE)

  @Inherited

  public @interface Service {

  String value();

  }

  使用方法跟java的其他注解一致,如:

  @Service("自定义注解类!")

  public class TestAnnontation {

  public void get(){

  System.out.println("9999");

  }

  }

  定义好一个注解之后,如何使用,怎么得到注解和解析注解,前面说过通过,如果一个自定义注解标注了@Retention(RetentionPolicy.RUNTIME) 是可以通过java反射来获取和解析该注解,接下来就看看如何做: