自定义注解

1 @interface 关键字

我们想定义一个自己的注解 需要使用 @interface 关键字来定义。
如定义一个叫 MyAnnotation 的注解:

public @interface MyAnnotation { }

2 元注解

光加上 @interface 关键字 还不够,我们还需要了解5大元注解

  • @Retention
  • @Target
  • @Documented
  • @Inherited(JDK8 引入)
  • @Repeatable(JDK8 引入)

1)@Retention 指定注解的生命周期

@Retention(RetentionPolicy.SOURCE)

其中Retention是一个枚举类:

  1. RetentionPolicy.SOURCE : 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃(.java文件)
  2. RetentionPolicy.CLASS :注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期(.class文件)
  3. RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在(内存中的字节码)

2)@Target指定注解可以修饰的元素类型

@Target(ElementType.Field)
  1. ElementType.ANNOTATION_TYPE - 标记的注解可以应用于注解类型。
  2. ElementType.CONSTRUCTOR - 标记的注解可以应用于构造函数。
  3. ElementType.FIELD - 标记的注解可以应用于字段或属性。
  4. ElementType.LOCAL_VARIABLE - 标记的注解可以应用于局部变量。
  5. ElementType.METHOD - 标记的注解可以应用于方法。
  6. ElementType.PACKAGE - 标记的注解可以应用于包声明。
  7. ElementType.PARAMETER - 标记的注解可以应用于方法的参数。
  8. ElementType.TYPE - 标记的注解可以应用于类的任何元素。

3)@Documented
指定注解会被JavaDoc工具提取成文档。默认情况下,JavaDoc是不包括文档的

4)@Inherited
表示该注解会被子类继承,注意,仅针对类,成员属性、方法并不受此注释的影响。

5)@Repeatable
表示注解可以重复使用,为了解决同一个注解不能重复在同一类/方法/属性上使用的问题。

其中最常用的就是 @Retention 跟 @Target。

3 简单实现

/**
 * 自定义的权限验证注解
 *
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAccess {

    /**
     * 是否需要实名认证,默认 true
     *
     * @return
     */
    boolean verify() default true;

    /**
     * 允许调用的用户类型
     *
     * @return
     */
    UserType userType() default UserType.ALL;

    /**
     * 用户类型
     */
    enum UserType {
        /**
         * 普通用户
         */
        NORMAL,
        /**
         * 专家用户
         */
        SPECIALIST,
        /**
         * 所有用户
         */
        ALL;
    }

}

4 使用切面执行自定义注解逻辑

在开发中一般加上注解之后会自动执行一些逻辑,大部分实现的原理是使用切面来实现注解的逻辑的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值