Java注解类型(@Annotation)

本文深入解析Java注解的格式及使用,包括@Retention、@Target、@Inherited等元注解的作用,以及如何通过Class对象获取注解信息。了解注解不能被继承的原因及其在代码中的实际应用。

注解格式

@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD })
public @interface LinAnnotation {
}

注解类不能被继承(反编译注解类的时候,发现注解类继承Annotation类,java不支持多继承)。

@Inherited 可以让注解被继承,但这并不是真的继承,只是通过使用@Inherited,可以让子类Class对象使用getAnnotations()获取父类被@Inherited修饰的注解。

注解

https://blog.youkuaiyun.com/javazejian/article/details/71860633

### `@within` 与 `@annotation` 的功能区别 `@within(com.example.Annotation)` 用于匹配在带有特定注解中定义的所有方法,即使这些方法本身没有标注该注解。例如,当一个被 `@MyAnnotation` 注解修饰时,该中所有方法的执行都会被匹配,无论方法是否也使用了 `@MyAnnotation` 注解[^1]。 ```java @Pointcut("@within(com.example.MyAnnotation)") public void classLevelPointcut() {} ``` 与此不同,`@annotation(com.example.Annotation)` 仅匹配那些方法上直接标注了指定注解的连接点。也就是说,只有方法本身带有该注解时,才会被切面逻辑所捕获[^2]。 ```java @Pointcut("@annotation(com.example.MyAnnotation)") public void methodLevelPointcut() {} ``` ### 使用场景对比 `@within` 更适用于对某一中的所有方法统一应用切面逻辑的场景。例如,在某个服务上标注了 `@Transactional` 注解,表示该中所有方法都应具有事务管理功能。在这种情况下,使用 `@within` 可以确保所有方法都受到事务切面的影响,而无需在每个方法上重复添加注解[^1]。 相比之下,`@annotation` 更适合需要对特定方法进行细粒度控制的场景。例如,当希望仅对某些需要日志记录的方法添加 `@Log` 注解时,使用 `@annotation` 可以精确控制哪些方法需要记录日志,并且可以在通知中访问该注解的属性值。 ```java @Around("@annotation(logAnnotation)") public Object logMethodCall(ProceedingJoinPoint joinPoint, LogAnnotation logAnnotation) throws Throwable { System.out.println("Calling method with log level: " + logAnnotation.level()); return joinPoint.proceed(); } ``` ### 行为差异与限制 一个关键区别在于:`@annotation` 允许将注解实例作为参数传递给通知方法,从而可以访问注解的属性。而 `@within` 虽然可以匹配级别的注解,但无法直接将上的注解实例传递给通知方法,因此在需要访问注解属性的场景中并不适用[^2]。 此外,`@within` 的匹配范围更广,它不仅匹配直接声明在上的注解,还匹配继承自父注解(如果该注解被 `@Inherited` 修饰)。这在某些需要对整个模块或包级别的进行统一处理时非常有用[^1]。 ### 综合使用策略 在实际开发中,为了实现更灵活的切面匹配策略,通常会将两者结合使用。例如,定义一个切点表达式,同时匹配级别和方法级别的注解: ```java @Pointcut("@within(com.example.MyAnnotation) || @annotation(com.example.MyAnnotation)") public void unifiedPointcut() {} ``` 这种组合方式允许对带有 `@MyAnnotation` 注解中的所有方法,以及单独标注了 `@MyAnnotation` 的方法进行统一处理,从而提升切面逻辑的复用性和灵活性[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值