目录
注解(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");
}
}
}