注解是在Java 5中添加的,用于提供元数据,编译器和各种框架可以使用这些数据。最初,它们帮助工具(例如,JUnit或Hibernate)更好地与代码交互,而无需编写重复或外部的配置。
注解允许向类、方法、字段、参数甚至局部变量添加信息。它们可以在编译时、运行时或在源代码处理期间用于验证、生成附加文件或修改程序行为。
声明自己的注解使用关键字@interface。
代码示例:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } class Example { @MyAnnotation("Test") public void annotatedMethod() {} }
关键特点:
注解只影响运行时吗?
不,注解可以仅限于源代码(SOURCE)、字节码(CLASS)或者在运行时可用(RUNTIME)。它们的影响取决于RetentionPolicy。
@Retention(RetentionPolicy.SOURCE) public @interface SourceOnly {}
注解的参数可以是任意类型吗?
不,允许的类型只有基本类型、字符串、枚举、其他注解以及这些类型的数组。对象不能使用。
注解可以继承吗?
严格来说,注解不像类那样被继承。唯一的例外是带有@Inherited的注解,它仅传播到子类(不会影响方法)。
在一个大型项目中,开发人员创建了几十种不同的注解用于自动化测试,却没有将它们记录、文档化或限制其作用域。结果是新团队成员很难理解哪些注解在哪儿工作。
优点:
缺点:
在团队中,实施了一项严格的策略来编写自己的注解:只添加必要的注解,详细描述每个注解,并限制其作用域。
优点:
缺点: