Java注解(Annotation)详解
注解(Annotation)是Java中用于添加元数据的特殊语法,相当于代码的标签。下面通过语法规则、元注解和应用场景三部分展开说明:
一、基本语法
- 定义注解:
public @interface 注解名称 {
数据类型 属性名() default 默认值; // 类似接口方法
}
- 使用示例:
@MyAnnotation(name = "示例", version = 1)
public class Demo {}
二、核心元注解
这些注解用于修饰其他注解的定义:
- @Target:指定注解作用目标
@Target(ElementType.METHOD) // 只能标注方法
public @interface TestAnnotation {}
支持的ElementType类型:
- TYPE(类/接口/枚举)
- FIELD(字段)
- METHOD(方法)
- PARAMETER(参数)
- CONSTRUCTOR(构造器)
- LOCAL_VARIABLE(局部变量)
- ANNOTATION_TYPE(注解)
- PACKAGE(包)
- @Retention:控制注解生命周期
@Retention(RetentionPolicy.RUNTIME) // 运行时可见
public @interface RuntimeAnnotation {}
策略说明:
- SOURCE:仅源码保留(如@Override)
- CLASS:编译后保留(默认值)
- RUNTIME:运行时可通过反射读取
- @Inherited:允许子类继承父类注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritableAnnotation {}
- @Documented:使注解出现在Javadoc中
@Documented
public @interface DocAnnotation {}
- @Repeatable:允许重复标注(需容器注解)
@Repeatable(Fish.class)
public @interface FishFood {
String value();
}
public @interface Fish {
FishFood[] value();
}
// 使用示例
@FishFood("虾米")
@FishFood("海藻")
public class Aquarium {}
三、典型应用场景
- 编译检查:@Override、@Deprecated
- 框架配置:Spring的@Autowired
- 代码生成:Lombok的@Data
- 单元测试:JUnit的@Test
四、反射读取注解示例Class<Demo> clazz = Demo.class;
if(clazz.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
System.out.println("Name: " + annotation.name());
}
提示:合理使用注解可以使代码更简洁,但要避免过度设计。元注解就像注解的基因,决定了注解的基础特性。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |