注解@interface简介以及使用

1、简介

注解@interface是一种在Java代码中添加元数据(metadata)的方式,它可以用于提供程序的额外信息,但本身并不会直接影响程序的执行。注解可以应用于类、方法、字段和其他程序元素,用于提供关于这些元素的额外信息。

使用注解可以为程序的编写和处理提供更多的灵活性和可读性,它们可以用于自动化生成文档、代码分析、编译时检查、运行时处理等。

要定义一个注解,需要使用@interface关键字,并在注解中声明属性。注解的属性可以是基本类型、字符串、枚举、注解类型或它们的数组。可以使用默认值为注解属性提供默认值。

1.1 示例

以下是定义一个注解的示例:

public @interface MyAnnotation {
   // 属性声明
   String value() default "default value";
   int number() default 0;
}

在上述示例中,@interface关键字定义了一个名为MyAnnotation的注解。注解中声明了两个属性:value和number,并为它们提供了默认值。

使用default关键字设置默认值,没设置默认值的变量则使用时必须提供,有默认值的变量使用时可以设置也可以不设置

要使用注解,可以在适当的位置使用注解的名称,并提供属性的值。以下是几个使用注解的示例:

@MyAnnotation
public class MyClass {
    @MyAnnotation(number = 10)
    private String myField;

    @MyAnnotation(value = "custom value", number = 20)
    public void myMethod() {
        // 方法体
    }
}

在上述示例中,@MyAnnotation应用于类MyClass、字段myField和方法myMethod。可以根据需要设置注解属性的值。

在运行时,可以使用Java的反射机制来获取和处理注解。例如,可以检查类是否应用了特定的注解,或者获取注解的属性值。

1.2 详解

1.2.1 @Target中的参数ElementType

@Target 是一个 Java 注解元注解(meta-annotation),用于指定注解可以应用于的目标元素类型。

@Target 注解包含一个属性 value,用于指定注解可以应用的目标元素类型。它可以接受一个元素类型的数组,用于指定多个目标元素类型。

以下是一些常见的目标元素类型:

  • ElementType.TYPE: 类、接口或枚举类型
  • ElementType.FIELD: 字段(包括枚举常量)
  • ElementType.METHOD: 方法
  • ElementType.PARAMETER: 方法或构造函数的参数
  • ElementType.CONSTRUCTOR: 构造函数
  • ElementType.LOCAL_VARIABLE: 局部变量
  • ElementType.ANNOTATION_TYPE: 注解类型
  • ElementType.PACKAGE: 包
  • ElementType.TYPE_PARAMETER: 类型参数(Java 8+)
  • ElementType.TYPE_USE: 类型使用(Java 8+)

以下是一个示例来说明 @Target 的使用:

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@interface MyAnnotation {
    String value();
}

@MyAnnotation("Example annotation")
public class MyClass {
    @MyAnnotation("Example annotation")
    public void myMethod() {
        // 方法的内容
    }
}

在上述示例中,我们定义了一个自定义注解 MyAnnotation,并将其标记为 @Target({ElementType.TYPE, ElementType.METHOD}),即指定了注解可以应用于类和方法。然后,在 MyClass 类和 myMethod 方法上应用了 MyAnnotation 注解。

这意味着我们只能将 MyAnnotation 注解应用于类和方法,而不能应用于其他类型的元素。

总结来说,@Target 是一个 Java 注解元注解,用于指定注解可以应用于的目标元素类型。通过 @Target 的 value 属性,可以指定注解可以应用于的目标元素类型,如类、字段、方法、参数等。这有助于限制注解的使用范围,确保它只能应用于适当的元素。

1.2.2 @Retention参数的RetentionPolicy

@Retention 是一个 Java 注解元注解(meta-annotation),用于指定注解的保留策略(retention policy)。保留策略定义了注解在何时有效以及在何时丢弃。

@Retention 注解包含一个属性 value,用于指定注解的保留策略。它可以有三个预定义的取值:

  • RetentionPolicy.SOURCE: 注解仅在源代码阶段保留,编译后的字节码中不包含该注解。在运行时无法获取到该注解的信息。这种保留策略主要用于编译时的静态检查和分析,对程序的运行没有影响。
  • RetentionPolicy.CLASS: 注解在编译时保留,包含在编译后的字节码中,但在运行时无法获取到该注解的信息。这是默认的保留策略,如果在注解上未显式指定保留策略,则使用该策略。
  • RetentionPolicy.RUNTIME: 注解在编译时保留,并在运行时可以通过反射机制获取到该注解的信息。这种保留策略允许在运行时处理注解,用于实现自定义的注解处理器、框架和其他运行时行为。

以下是一个示例来说明 @Retention 的使用:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String value();
}

@MyAnnotation("Example annotation")
public class MyClass {
    // 类的内容
}

在上述示例中,我们定义了一个自定义注解 MyAnnotation,并将其标记为 @Retention(RetentionPolicy.RUNTIME),即指定了保留策略为运行时保留。然后,在 MyClass 类上应用了 MyAnnotation 注解。

在运行时,可以使用反射机制获取 MyClass 类的注解信息,包括注解的属性值。这是因为我们指定了 @Retention(RetentionPolicy.RUNTIME),使得注解在编译时保留并可以在运行时获取。

总结来说,@Retention 是一个 Java 注解元注解,用于指定注解的保留策略。通过 @Retention 的 value 属性,可以指定注解的保留策略为 SOURCE、CLASS 或 RUNTIME。保留策略决定了注解在何时有效以及在何时丢弃。

1.2.3 @Inherited

@Inherited 是一个 Java 注解元注解(meta-annotation),用于指示某个注解是否可以被继承。当一个注解被 @Inherited 标记时,它可以被继承到子类中。

具体来说,如果一个被 @Inherited 标记的注解应用于某个父类,那么当这个父类的子类没有显式地使用相同的注解时,子类会继承父类的注解。这意味着子类也会被认为具有相同的注解。

需要注意的是,@Inherited 只对类的继承有效,对接口的继承无效。

以下是一个示例来说明 @Inherited 的使用:

import java.lang.annotation.*;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String value();
}

@MyAnnotation("Parent Annotation")
class ParentClass {
}

class ChildClass extends ParentClass {
}

public class Main {
    public static void main(String[] args) {
        ParentClass parent = new ParentClass();
        ChildClass child = new ChildClass();

        // 检查父类是否具有 MyAnnotation 注解
        MyAnnotation parentAnnotation = parent.getClass().getAnnotation(MyAnnotation.class);
        System.out.println("Parent Annotation: " + parentAnnotation);

        // 检查子类是否具有 MyAnnotation 注解
        MyAnnotation childAnnotation = child.getClass().getAnnotation(MyAnnotation.class);
        System.out.println("Child Annotation: " + childAnnotation);
    }
}

在上述示例中,我们定义了一个自定义注解 MyAnnotation,并将其标记为 @Inherited。然后,在 ParentClass 上应用了 MyAnnotation 注解。接着,我们创建了一个 ChildClass 的实例。

在运行时,我们通过反射获取了 ParentClass 和 ChildClass 的注解,并打印出注解的值。由于 MyAnnotation 被标记为 @Inherited,ChildClass 继承了 ParentClass 的注解,所以它也被认为具有相同的注解。
输出结果将会是:

Parent Annotation: @MyAnnotation(value=Parent Annotation)
Child Annotation: @MyAnnotation(value=Parent Annotation)

可以看到,子类 ChildClass 继承了父类 ParentClass 的注解。

总结来说,@Inherited 是一个 Java 注解元注解,用于指示某个注解是否可以被继承。当一个注解被 @Inherited 标记时,它可以被继承到子类中。

1.2.4 @Documented

@Documented 是一个 Java 注解元注解(meta-annotation),用于指示被注解的元素是否包含在 API 文档中。

当一个注解被 @Documented 标记时,它的信息将包含在生成的 API 文档中。这样,使用该注解的程序员就可以在文档中看到该注解的说明和使用方法,以便更好地理解和使用被注解的元素。

需要注意的是,@Documented 仅用于指示注解本身是否包含在 API 文档中,而不影响注解应用的元素是否包含在文档中。

以下是一个示例来说明 @Documented 的使用:

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String value();
}

@MyAnnotation("This is a documented annotation.")
public class MyClass {
    // 类的内容
}

在上述示例中,我们定义了一个自定义注解 MyAnnotation,并将其标记为 @Documented。然后,在 MyClass 类上应用了 MyAnnotation 注解。

当我们生成 API 文档时,无论是使用工具(如 Javadoc)还是集成开发环境(IDE),文档中都会包含有关被注解的元素(在这种情况下是类 MyClass)的注解信息。这样,其他开发人员在查看文档时可以获得有关该注解的说明和使用方法。

总结来说,@Documented 是一个 Java 注解元注解,用于指示被注解的元素是否包含在 API 文档中。当一个注解被 @Documented 标记时,它的信息将包含在生成的 API 文档中,以提供给其他开发人员查看。

  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值