Java中的注解

来源:互联网 发布:卡卡西偏心佐助 知乎 编辑:程序博客网 时间:2024/05/21 10:10

注解(Annotation ) 是JDK 1.5 的新特性,现已应用于Spring , EJB ,JPA... 使用注解是一种趋势。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。

注解是向编译器或工具软件传达一种信息,相当于是一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具或其它程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事情。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

注解的语法可以看Java语言规范了解,即Java的language specification 。

注解的语法比较简单,除了@符号的使用以外,它基本上与java的固有语法一致,java内置了三种最基本的注解,定义在java.lang包中。

      @Override  表示当前方法是覆盖父类的方法。

      @Deprecated  表示当前元素是不赞成使用的。

      @SuppressWarnings 表示关闭一些不当的编译器警告信息。{ 

     @SuppressWarnings,其参数有:

      deprecation,使用了过时的类或方法时的警告

      unchecked,执行了未检查的转换时的警告

      fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告

      path,在类路径、源文件路径等中有不存在的路径时的警告

      serial,当在可序列化的类上缺少 serialVersionUID 定义时的警告

      finally ,任何 finally 子句不能正常完成时的警告

      all,关于以上所有情况的警告

 }



元注解@Target,@Retention,@Documented,@Inherited (元注解指的是注解中的注解)
   
      @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: 
          ElemenetType.CONSTRUCTOR 构造器声明 
          ElemenetType.FIELD 域声明(包括 enum 实例) 
          ElemenetType.LOCAL_VARIABLE 局部变量声明 
          ElemenetType.METHOD 方法声明 
          ElemenetType.PACKAGE 包声明 
          ElemenetType.PARAMETER 参数声明 
          ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 
           
      @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括: 
          RetentionPolicy.SOURCE 注解将被编译器丢弃 
          RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃 
          RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 
           
      @Documented 将此注解包含在 javadoc 中 
       
      @Inherited 允许子类继承父类中的注解 


import java.lang.annotation.Annotation;import javase.day18.AlexAnnotation.FontColor;@AlexAnnotation(value="test")public class AnnotationTest {//@SuppressWarning提示编译器或工具软件禁止提示警告信息@SuppressWarnings("deprecation")public static void main(String[] args) {System.runFinalizersOnExit(true);if( AnnotationTest.class.isAnnotationPresent(AlexAnnotation.class)){AlexAnnotation annotation = (AlexAnnotation) AnnotationTest.class.getAnnotation(AlexAnnotation.class);System.out.println("value:"+annotation.value()+"\ncolor:"+annotation.color()+"\nattr's array length:"+annotation.attr().length+"\nFontColor:"+FontColor.BLUE);}}
运行结果是:

value:test
color:white
attr's array length:3
FontColor:BLUE


自定义注解:

它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface

为自定义注释添加变量

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})public @interface AlexAnnotation {public static enum FontColor {BLUE, RED, GREEN;};String value();String color() default "white" ;int[] attr() default {1,2,3};FontColor fontColor() default FontColor.BLUE;}

原创粉丝点击