Java 基础 -- 注解(Annotation)知识点及使用实例

一、引言

在Java开发中,注解(Annotation)是一种强大的元数据工具,它可以为Java代码提供额外的信息,并且可以在编译时、类加载时或运行时被读取和使用。注解不会直接影响程序的执行逻辑,但可以为编译器、框架或其他工具提供有用的元数据信息。本文将详细讲解Java注解的核心知识点,并通过使用实例进行说明。

二、Java注解的核心知识点

1.注解的定义

Java注解是通过@interface关键字定义的。注解的定义看起来很像接口,但方法没有实际的方法体,只有返回值类型。注解中的方法被称为元素(Element),并且必须指定一个默认值

public @interface MyAnnotation {  
    String value() default "";  
    int number() default 0;  
    String[] aliases() default {};
}

2.注解的参数类型

注解的参数被限制为以下类型:

  • 原始类型:int, double, float, long, short, byte, boolean, char。
  • String 类型。
  • 枚举类型:自定义或 Java 内置的枚举。
  • 类类型:但只能是 String.class、其他注解或可序列化的类 (Serializable)。
  • 以上类型的数组。

注解的参数可以是单值或数组。

3.注解的分类

  1. 内置注解:Java提供了三种内置注解,分别是@Override、@Deprecated和@SuppressWarnings。
  2. 元注解:用于定义注解的注解,包括@Target、@Retention、@Documented和@Inherited。
    (1) @Target 修饰的对象范围
    @Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、
    接口、枚举、Annotation 类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数
    和本地变量(如循环变量、catch 参数)。在 Annotation 类型的声明中使用了 target 可更加明晰其修饰的目标

示例值:

  • ElementType.TYPE:类、接口(包括注解类型)或enum声明
  • ElementType.FIELD:字段(包括enum常量)
  • ElementType.METHOD:方法
  • ElementType.PARAMETER:方法参数
  • ElementType.CONSTRUCTOR:构造方法
  • ElementType.LOCAL_VARIABLE:局部变量
  • ElementType.ANNOTATION_TYPE:另一个注解
  • ElementType.PACKAGE:包

(2) @Retention 定义 被保留的时间长短
Retention 定义了该 Annotation 被保留的时间长短:表示需要在什么级别保存注解信息,用于描
述注解的生命周期(即:被描述的注解在什么范围内有效)

示例值:

  • RetentionPolicy.SOURCE:注解只在源码中存在,编译时会被丢弃(默认行为)
  • RetentionPolicy.CLASS:注解会被记录在class文件中,但运行时无法获取
  • RetentionPolicy.RUNTIME:VM将在运行时保留注解,因此可以通过反射机制读取注解的信息

(3)@Documented 描述-javadoc
@ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因
此可以被例如 javadoc 此类的工具文档化。
(4) @Inherited 阐述了某个被标注的类型是被继承的
@Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一
个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该
class 的子类。

4.注解的使用

注解可以应用于类、方法、字段、参数、局部变量等。使用时只需在相应的元素前加上@符号和注解名称即可。

@MyAnnotation(value = "Hello", number = 123)  
public class MyClass {  
    // ...  
}

5. 运行时获取注解

使用反射API可以在运行时获取注解。

if (method.isAnnotationPresent(MyAnnotation.class)) {
    MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
    // ...
}

三、使用实例

以下是一个简单的使用实例,演示了如何定义和使用自定义注解。

1. 定义自定义注解

import java.lang.annotation.*;  
  
@Target(ElementType.METHOD) // 注解只能应用于方法  
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可见  
public @interface MyCustomAnnotation {  
    String value() default "";  
}

2. 使用自定义注解

public class AnnotationDemo {  
  
    @MyCustomAnnotation(value = "This is a custom annotation")  
    public void doSomething() {  
        // ...  
    }  
  
    public static void main(String[] args) {  
        // 反射获取方法上的注解信息  
        for (Method method : AnnotationDemo.class.getDeclaredMethods()) {  
            if (method.isAnnotationPresent(MyCustomAnnotation.class)) {  
                MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);  
                System.out.println("Method: " + method.getName());  
                System.out.println("Annotation Value: " + annotation.value());  
            }  
        }  
    }  
}

在上述示例中,我们定义了一个名为MyCustomAnnotation的自定义注解,并将其应用于AnnotationDemo类中的doSomething方法。然后,在main方法中,我们使用反射获取了该方法上的注解信息,并输出了注解的值。

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值