zoukankan      html  css  js  c++  java
  • 10分钟学会JAVA注解(annotation)

    (原)

    先认识注解(Annotation

    定义类用class,定义接口用interface,定义注解用@interface

    public @interface AnnotationTest{}

    所有的注解类型都自动的继承于java.lang.annotation.Annotation接口

     

    Annotation接口文档中这样描述:所有注解类型都扩展于这个公共的接口,注意,一个接口,

    手动的继承了这个接口,并不意味着它是一个注解类型。换句话说,这个接口本身不是一个注解类型。

    注意:这里Annotation是个接口,不是注解,注解是不能继承的

    @Retention:保留注解

     

    里面有一个RetentionPolicy保留策略的枚举属性

     

    这里有三个值:

    SOURCE:注解会被编译器丢弃,不会被编译到.class文件中

    CLASS:在编译时,注解会被保留在.class编译文件中,但是不会被虚拟机读取,这是一个预设值。

    RUNTIME:注解会被保留在.class编译文件中,并且可以被虚似机在运行时获取到,所以他们能以反射的方式读取。

    例如:平常编译代码时,用来压制IDE警告的注解@SuppressWarnings

    重写的注解@Override

     

    被注解为SOURCE,这二个注解只会在编译期运行,不会被编译进.class文件

    如果注解需要用到反射,那么必需了解AnnotatedElement

     

    (以上实现是1.6版本的JDK1.8版本已经改了,添加了几个,这里就不列出来了。)

    注意:如果需要用到反射,一定要定义@Retention的值为RUNTIME,因为他的默认值是CLSS

    下面一个例子来认识注解怎么用,注解写的很清楚了,就不多说了。

    这里定义了一个注解@AnnotationTest

     

    下面介绍另一个重要的注解

    @Target

     

    @Retention一样,也有一个枚举类型的属性

     

    这里值有很多,比如METHOD,这个值只能修饰方法,FIELD,这个值只能修饰属性等

    比如说我将刚才自己写的注解加上@Target({ElementType.FIELD})

     

    那么刚才的这个地方就会报错

     

    提示我这个注解不允许放在这个地方。

    JAVA注解有很多,实际开发中很少会自己去写,都是用的第三方或是框架的,只要知道其基本原理,其实这些东西都很简单。

    元注解:

    1.@Retention: 定义注解的保留策略
    @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含
    @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
    @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
    首 先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。


    2.@Target:定义注解的作用目标
    源码为:
    @Documented  
    @Retention(RetentionPolicy.RUNTIME)  
    @Target(ElementType.ANNOTATION_TYPE)  
    public @interface Target {  
        ElementType[] value();  
    }  
    @Target(ElementType.TYPE)   //接口、类、枚举、注解
    @Target(ElementType.FIELD) //字段、枚举的常量
    @Target(ElementType.METHOD) //方法
    @Target(ElementType.PARAMETER) //方法参数
    @Target(ElementType.CONSTRUCTOR)  //构造函数
    @Target(ElementType.LOCAL_VARIABLE)//局部变量
    @Target(ElementType.ANNOTATION_TYPE)//注解
    @Target(ElementType.PACKAGE) ///包    
    3.@Document:说明该注解将被包含在javadoc中
    4.@Inherited:说明子类可以继承父类中的该注解

  • 相关阅读:
    实现MAXIMO7.5工作流任务箱任务颜色提示功能
    MAXIMO 快速查找实现
    DELPHI 通过方法名执行方法
    MAXIMO收件箱中,检修路线修改为其它名称
    在Linux 上手工创建 oracle 11g R2 数据库
    解决 maximo7.X 设备树子节点显示不全
    C++转换构造函数和隐式转换函数
    类或者结构体用无参构造函数创建对象时不需要带括号, 否则会当成函数声明
    今天我注册自己的博客啦,吼吼吼。。
    css3学习
  • 原文地址:https://www.cnblogs.com/LeeScofiled/p/6906351.html
Copyright © 2011-2022 走看看