ultron110 发表于 前天 22:05

请生动形象、完整细致地讲解一下Java中注解的用法和语法规则,要求条分缕析。

尤其是元注解:
@Target
@Retention
@Inherited
@Documented
@Repeatable

FishC 发表于 前天 22:06

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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 请生动形象、完整细致地讲解一下Java中注解的用法和语法规则,要求条分缕析。