@interface 自定义注解(源码学习总结)以及案例

基本元素

任意打开一个注解都可以发现有基本的三个注解
在这里插入图片描述
翻译一下:
Retention 保留,保持
Documented 记录
Target 目标

ElementType 元素类型
RetentionPolicy 保留 政策

@Target
进入@Target注解查看介绍,这个是用来指定该注解适用范围的,ElementType进入后是一个枚举类,提供各种适用范围
在这里插入图片描述
从这里可以看得出传入的参数可以是该枚举类的数组形式,也就是支持多种类型,写入时可以在数组 { }中使用 , 分割填写多个值
而且@Target中存在值的情况下会强制去执行使用限制。
如果注释类型{@code@Target}上不存在{@code@Target}元注释,类型为{@code T}的注释可以作为除类型参数声明之外的任何声明的修改器来编写。

进入枚举类,ElementType提供如下:
TYPE
类,接口(包含注释类型的接口),枚举上声明

FIELD
一般成员属性(包含枚举)上声明

METHOD
方法上声明

PARAMETER
形式参数上声明

CONSTRUCTOR
构造函数上声明

LOCAL_VARIABLE
局部变量上声明

ANNOTATION_TYPE
注解上声明

PACKAGE
包上声明

TYPE_PARAMETER
类型参数声明

TYPE_USE
类型的使用?(翻译后是 字体的使用)

@Retention

在这里插入图片描述

进入源码查看介绍了解到这个保留指的是这个注解的保留时长,如果没有提供值则默认采用RetentionPolicy.CLASS
且该注解仅在元注解类型直接用于注解时有效。如果元注释类型用作其他注释类型中的成员类型,则它无效。
看的出来,这个保留政策(或者说保留时长的策略)只能采用一种,不能多个。

进入枚举类后只提供了三种类型
SOURCE
编译器将丢弃注解(指的应该是只在编译阶段存活)

CLASS
由编译器记录在CLASS文件中,不在运行时由VM(虚拟机)保留。默认时为该模式。

RUNTIME
注释将由编译器记录在CLASS文件中,并在运行时由VM获取,因此可以反射地读取它们。

@Documented

指示默认情况下,Javadoc和类似工具将记录具有类型的注释。此类型应用于注释其注释影响其客户端使用注释删除的类型的删除。如果使用Documented对类型声明进行注释,则其注释将成为注释元素的公共API的一部分。

不需要传值,功能性注释。

实际定义尝试,注解同样可以携带属性

属性可以为一般的数据类型,也可以是自定义的类 或者枚举等。

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation{

    String comment()  default "";

    int mill() default 0;

    String[] team() default {};

    Class beanClass() default Object.class;

    boolean rightOr() default false;

}

在某一方法上定义

    @MyAnnotation(comment = "45454", mill = 10, team = {"wo", "44845"}, rightOr = true)
    public void testMethod(){

    }

类似的可以参考 spring携带的注解以及其他框架携带的注解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值