java自定义注解

转载:https://blog.csdn.net/xsp_happyboy/article/details/80987484

什么是注解?

官方描述:注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。

注解的生命周期:

第一类是由编译器使用的注解(java源文件阶段),例如:
@Override:让编译器检查该方法是否正确地实现了覆写;
@SuppressWarnings:告诉编译器忽略此处代码产生的警告。
这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了

第二类是由工具处理.class文件使用的注解(编译到class阶段),比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入.class文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。

第三类是在程序运行期能够读取的注解(运行阶段),它们在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了@PostConstruct的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。

自定义注解

底层上,所有注解都会自动继承java.lang.annotation.Annotation接口,一个简单的自定义注解如下:

public @interface MyAnnotation {
    public String name();
    int[] array();
    int value() default 18;
}

定义的内容称为注解类型元素,注解类型元素需要注意以下几点:

  • 权限修饰符必须为public,不写默认为public
  • 括号不是定义方法参数的地方,也不能在括号中定义任何参数,仅仅只是一个特殊的语法
  • default可以给定默认值 如果只有一个注解类型元素,元素名起为value

只有一个注解类型元素的定义规则(注解元素起名为value):

public @interface MyAnnotation {
    int value() default 18;
}
元注解:

有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解

常用的元注解:

@Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。它使用一个枚举类型定义如下:

public enum ElementType {
    /** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,

    /** 属性的声明 */
    FIELD,

    /** 方法的声明 */
    METHOD,

    /** 方法形式参数声明 */
    PARAMETER,

    /** 构造方法的声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包的声明 */
    PACKAGE
}

用法如下:
自定义了一个@MyAnnotation注解,这个注解只能用于类,接口,方法上面

@Target(value = {ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
    String name();
    int age() default 18;
    int[] array();
}

@Retention注解,定义注解的生命周期,注解的生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。同样使用了RetentionPolicy枚举类型定义了三个阶段:

public enum RetentionPolicy {
    /**
     * 仅编译期使用
     */
    SOURCE,

    /**
     * (注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)
     */
    CLASS,

    /**
     * (注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)
     */
    RUNTIME
}

实际开发过程中几乎使用的 RetentionPolicy.RUNTIME

@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中

@Repeatable这个元注解可以定义Annotation是否可重复。这个注解应用不是特别广泛

@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用,并且仅针对class的继承,对interface的继承无效

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值