注解入门一

Java中的Annotation 在流行的框架中用的越来越多,所以对注解的原理大概介绍一下,Java5以后就开始支持注解,所以到今天注解已经成为元老级技术

我们使用@interface来定义注解,它其实跟class 、interface 、enum都类似,用来标识类型。Java中annotation包下提供了这几个注解,类,接口,另外java.lang包下面又提供了五个注解

下面挨个看一下他们的源码注释基本就对注解有个了解了

一 Annotation接口

/**
 * The common interface extended by all annotation types.  Note that an
 * interface that manually extends this one does <i>not</i> define
 * an annotation type.  Also note that this interface does not itself
 * define an annotation type.
 * @author  Josh Bloch
 * @since   1.5
 */
public interface Annotation {

    boolean equals(Object obj);
     int hashCode();
     String toString();
     /**
     * Returns the annotation type of this annotation.
     * @return the annotation type of this annotation
     */
    Class<? extends Annotation> annotationType();

}

所有注解都是基于此接口扩展,差不多他就是所有注解类型的父类,基类,祖先。。。但是请注意,自己写一个类或接口继承这个接口,自己写的这个并不是注解类型,同时这个接口本身也不是一个注解(很绕),如何定义注解后面介绍。为什么说它是所有注解的基类呢,看下图,在ieda开发工具中,点击实现的小图标,所有的注解就都出来了

再看它里面有四个方法,前三个我们都很属性,主要看第四个annotationType,返回这个注解的类型,这个先知道有这么个方法,后面有用

二  AnnotationFormatError

public class AnnotationFormatError extends Error {
    private static final long serialVersionUID = -4256701562333669892L;

    
    public AnnotationFormatError(String message) {
        super(message);
    }
 
    public AnnotationFormatError(String message, Throwable cause) {
        super(message, cause);
    }
 
    public AnnotationFormatError(Throwable cause) {
        super(cause);
    }
}

当 annotation parser 注解解析器从类里面读取注解解析报错的时候会抛出这个错误

三 @Documented,@Repeatable,@Retention,@Target

这几个个都是元注解,就是用来声明注解类型时需要使用到的注解

@Documented加上这个注解后,表明这个注解应该被 javadoc工具记录,默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员

@Inherited使用此注解声明出来的自定义注解,在使用此自定义注解时,如果注解在类上面时,子类会自动继承此注解,否则的话,子类不会继承此注解。这里一定要记住,使用Inherited声明出来的注解,只有在类上使用时才会有效,对方法,属性等其他无效。

@Retention用来定义自定义注解的什么周期,RetentionPolicy value();它里面有个value属性,是一个RetentionPolicy类型,共有三种取值,

source:自定义注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略

class:自定义注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

runtime:自定义注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

@Target用来定义自定义注解的使用范围,ElementType[] value();他也有一个value属性,是个数组,说明可以指定多个,若@Target注解未指定value值,则表明被@Target修饰的注解可以用于任何范围

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration 表明此注解可以用在类或接口上 */
    TYPE,

    /** Field declaration (includes enum constants)表明此注解可以用在成员属性上 */
    FIELD,

    /** Method declaration 表明此注解可以用在方法上 */
    METHOD,

    /** Formal parameter declaration 表明此注解可以用在参数上*/
    PARAMETER,

    /** Constructor declaration 表明此注解可以用在构造方法上*/
    CONSTRUCTOR,

    /** Local variable declaration 表明此注解可以用在局部变量上*/
    LOCAL_VARIABLE,

    /** Annotation type declaration 表明此注解可以用在注解类型上*/
    ANNOTATION_TYPE,

    /** Package declaration 用于记录java文件的package文件信息,package-info.java 文件为包级文档和包级别注释提供一个地方*/
    PACKAGE,

    /**
     * Type parameter declaration
     *  类型参数声明
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *  类型使用声明
     * @since 1.8
     */
    TYPE_USE
}

四 @Native,@Repeatable

为jdk1.8以后提供,@Native用来标记native的属性,只对属性有效,且只在代码中使用,一般用于给IDE工具做提示用。@Repeatable允许在同一申明类型(类,属性,或方法)的多次使用同一个注解

下一节说一下注解的使用及工作原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值