Java注解

发布于:2024-04-26 ⋅ 阅读:(27) ⋅ 点赞:(0)

目录

注解(Annotation)

自定义注解

使用注解

注解的本质

元注解

@Target:

@Retention:

注解的解析

如何解析注解

演示步骤

1. 获取目标元素的 Class 对象

2. 获取注解信息

3. 解析注解信息

示例代码


注解(Annotation)

就是Java代码里的特殊标记,比如:@Override,@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。

注意:注解可以用在类上,构造器上,方法上,成员变量上,参数上,等位置

自定义注解

除了内置注解,我们还可以定义自己的注解。自定义注解使用 @interface 关键字来声明,可以包含元素(成员变量)和默认值。例如:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "default value";
    int count() default 1;
}

使用注解

使用注解时,我们可以在程序中通过反射获取注解信息,并根据注解信息执行相应的操作。例如,可以通过反射检查方法是否被某个注解标记,并根据注解信息执行不同的逻辑。

import java.lang.reflect.*;

public class Main {
    @MyAnnotation(value = "myValue", count = 2)
    public static void myMethod() {
        // Method body
    }

    public static void main(String[] args) throws Exception {
        Method method = Main.class.getMethod("myMethod");
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        if (annotation != null) {
            System.out.println("Value: " + annotation.value());
            System.out.println("Count: " + annotation.count());
        }
    }
}

注解的本质

通过编译反编译字节码可以看出:注解本质是一个接口,都是继承Annotation注解的,里面的属性都为抽象方法

使用注解的时候,使用注解就是实现类对象。

元注解

指的是:修饰注解的注解

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {}

比如@Retention,@Target就是元注解。

@Target:

作用:声明被修饰的注解只能在哪些位置使用

@Target(ElementTye.TYPE)

1.TYPE,类,接口

2.FIELD,成员变量

3.METHOD,成员方法

4.PARAMETER,方法参数

...

@Retention:

作用:声明注解的保留周期

@Retention(RetentionPolicy.RUNTIME)

1.SOURCE:只作用在源码阶段,字节码文件中不存在。

2.CLASS(默认值):保留到字节码文件阶段,运行阶段不存在

3.RUNTIME(开发常用):一直保留到运行阶段

注解的解析

就是判断类上,方法上,成员变量上是否存在注解,并把注解里的内容给解析出来。

如何解析注解

指导思想:要解析谁上面的注解就应该先拿到谁。

比如要解析类上面的注解:则应该先获取该类的class对象,再通过class对象解析其上面的注解。

比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。

演示步骤

1. 获取目标元素的 Class 对象

首先,我们需要获取目标元素(类、方法、字段等)的 Class 对象。可以通过以下方式之一获取:

  • 对象实例的 getClass() 方法。
  • 类字面常量,如 MyClass.class

2. 获取注解信息

通过 Class 对象,我们可以使用反射方法来获取注解信息。例如:

  • getAnnotation(Class<T> annotationClass):获取指定类型的注解对象。
  • getAnnotations():获取所有的注解对象。

3. 解析注解信息

获取注解对象后,我们可以根据注解的定义,获取注解元素的值。注解元素可以是基本类型、枚举类型、注解类型、数组类型等。

示例代码

下面是一个简单的示例代码,演示了如何通过反射获取类上的注解信息:

import java.lang.annotation.*;

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

@MyAnnotation(value = "MyClass Annotation")
public class MyClass {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;

        // 获取类上的注解对象
        MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);

        // 解析注解信息
        if (annotation != null) {
            String value = annotation.value();
            System.out.println("Annotation Value: " + value);
        } else {
            System.out.println("No Annotation Found");
        }
    }
}