自定义一个注解

Java注解在代码中起到了提供元数据和描述信息的作用。它们可以与类、方法、字段等一起使用,以提供更多的信息和指示。
以下是一些Java注解的常见作用:
提供编译时检查:注解允许开发者在代码编译阶段进行静态检查,以捕获潜在的编译错误或问题。例如,@Override注解可以确保子类正确重写了父类的方法。
自动生成代码:通过使用注解处理器,可以根据注解生成额外的代码,从而减少开发人员的工作量。例如,使用@Getter和@Setter注解可以自动生成Java Bean中的getter和setter方法。
运行时处理:通过反射机制,可以在运行时对注解进行处理,并根据注解提供的信息执行相应的逻辑。这使得我们可以动态地根据注解配置应用程序的行为。
生成文档:许多文档生成工具能够读取注解并生成相关的文档。注解提供了关于代码的额外描述信息,有助于完善文档内容
定义约束和规范:注解可以用于定义代码中的约束和规范,以确保代码符合特定的标准和规范。例如,@NotNull注解可以用于强制验证参数不能为空。
标记和过滤:注解可以用于标记特定的代码元素,以便在后续的处理中进行过滤或选择。例如,@Test注解用于标记测试方法。

那么我们如何实现一个自定义的注解呢?

1.定义一个注解类

/**
 * 自定义一个改变缓存的注解
 */
@Inherited
@Documented
@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME)
public @interface ChangeCache {
    //改变数值
    int changeValue() default 11;
}

在这里插入图片描述

@Inherited:Java中的一个元注解(即可以用于注解其他注解的注解),用于指示被标记的注解是否可以被继承。当一个类使用了被@Inherited注解标记的注解时,其子类将自动继承该注解。具体来说,如果一个类使用了被@Inherited注解标记的注解A,在创建该类的子类时,子类也会自动继承该注解A。这样,通过在基类上使用注解,我们可以确保子类也具有相同的注解信息。需要注意的是,@Inherited仅适用于类和接口的继承关系,不适用于其他类型的继承,如成员变量或方法的继承。
@Documented:Java中的一个元注解(即可以用于注解其他注解的注解),用于指示被标记的注解是否应该被包含在生成的Java文档中。通常情况下,使用注解并不会将注解本身包含在生成的API文档中,而只会包含注解应用的地方。但是,通过给注解添加@Documented注解,可以将标记为@Documented的注解及其相关信息包含在生成的API文档中,以便开发者能够查看和了解注解的具体信息及用法。@Documented元注解仅影响注解本身的文档可见性,对注解应用的地方没有影响。
@Target:用于指示其他注解可以应用的目标元素类型。它接受一个
ElementType数组作为参数,表示注解可以应用于哪些元素上。
ElementType枚举包括以下常量:
TYPE:类、接口或枚举
FIELD:字段(成员变量)
METHOD:方法
PARAMETER:方法参数
CONSTRUCTOR:构造函数
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包
@Retention:注解用于指示其他注解的保留策略。它接受一个
RetentionPolicy枚举类型的参数,表示注解的生命周期。
RetentionPolicy枚举包括以下常量:
SOURCE:注解仅存在于源代码中,在编译时被丢弃,不会出现在编译后的字节码中。
CLASS:注解存在于编译后的字节码中,但在运行时被忽略(默认值)。
RUNTIME:注解存在于编译后的字节码中,并在运行时可以通过反射机制获取到。
例如,如果一个注解希望在运行时可以通过反射访问到,则可以在该注解上使用@Retention(RetentionPolicy.RUNTIME)。
2.编写注解的具体逻辑方法

@Component
@Aspect
public class CacheCache {
    @Around("@annotation(com.plan.step_redis.annotation.ChangeCache)")
    public void cacheAspectMethod(ProceedingJoinPoint point) {
        System.out.println("进入缓存方法");
    }
}

@Aspect:注解用于标识一个类为切面类。切面类中可以定义一些通知(Advice),例如在目标方法执行之前或之后执行额外的逻辑。这些通知可以通过其他注解来标识,例如@Before、@After、@Around等。切面类中还可以定义切点(Pointcut),用于指定哪些方法会被拦截和增强。
3.在注解实现方法中获取注解中传过来的值

@Around("@annotation(com.plan.step_redis.annotation.ChangeCache)")
public Object cacheAspectMethod(ProceedingJoinPoint point) {
    //获取注解上传递的内容
    MethodSignature signature = (MethodSignature) point.getSignature();
    ChangeCache changeCache = signature.getMethod().getAnnotation(ChangeCache.class);
    int i = changeCache.changeValue();
    System.out.println("i的值是:" + i);
    try {
        return point.proceed(point.getArgs());//返回继续执行方法
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值