Java注解合并,注解继承

本文介绍如何在Spring MVC框架中将多个注解合并为一个自定义注解,以简化控制器类的声明,并通过示例展示具体的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring中有时候一个类上面标记很多注解。


实际上Java注解可以进行继承(也就是把多个注解合并成1个)


比如说SpringMVC的注解

@RestController
@RequestMapping("/person")

可以合并为一个


@PathRestController("/user")

实现是:


import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RestController
@RequestMapping
public @interface PathRestController {
	@AliasFor("path")
	String[] value() default {};

	@AliasFor("value")
	String[] path() default {};
}


Java中的注解(Annotation)本质上是一种元数据,它可以被应用在类、方法、字段等程序元素上。默认情况下,注解不具备继承性,也就是说,如果一个类使用了某个注解,它的类并不会自动继承注解。 然而,Java提供了一个特殊的注解 `@Inherited`,它用于指示某个注解是否可以被继承。当一个自定义注解被 `@Inherited` 标记,并且该注解应用于某个类时,那么该类的类将自动继承注解。需要注意的是,`@Inherited` 只影响类的继承行为,它不会影响方法或字段上的注解类中的可见性。 例如,假设有一个自定义注解 `@MyAnnotation`,并且它被 `@Inherited` 标记: ```java @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } ``` 如果一个类 `Parent` 使用了 `@MyAnnotation` 注解: ```java @MyAnnotation public class Parent { } ``` 那么其类 `Child` 将会继承 `@MyAnnotation` 注解: ```java public class Child extends Parent { } ``` 在这种情况下,通过反射机制可以检查 `Child` 类是否具有 `@MyAnnotation` 注解[^1]。 此外,需要注意的是,`@Inherited` 的作用仅限于类层次结构中的继承关系,它不适用于接口或方法级别的注解继承。如果希望接口或方法上的注解也能被继承,需要手动在接口或方法上重复注解,或者使用其他机制来实现类似的功能[^2]。 ### 示例代码 以下是一个简单的示例,展示了如何使用 `@Inherited` 注解: ```java import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } ``` ```java @MyAnnotation public class Parent { } ``` ```java public class Child extends Parent { } ``` 通过反射机制,可以检查 `Child` 类是否具有 `@MyAnnotation` 注解: ```java public class TestInherited { public static void main(String[] args) { boolean isAnnotated = Child.class.isAnnotationPresent(MyAnnotation.class); System.out.println("Is Child annotated with @MyAnnotation? " + isAnnotated); } } ``` 运行结果将显示 `Child` 类确实继承了 `@MyAnnotation` 注解。 ### 注意事项 - `@Inherited` 仅影响类的继承行为,不会影响接口或方法注解继承。 - 如果一个类实现了多个接口,并且这些接口上有相同的注解,那么这些注解不会自动合并,需要手动处理。 - 使用 `@Inherited` 时,必须确保注解的保留策略为 `RUNTIME`,以便在运行时通过反射机制访问注解信息。 通过合理使用 `@Inherited` 注解,可以简化代码并提高代码的可读性和可维护性。然而,需要注意其局限性和使用场景,以确保注解的正确继承和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值