在你给我的这个回答的基础上,给我分别举@Retention(RetentionPolicy.CLASS)和@Retention(RetentionPolicy.RUNTIME)两个简单的例子
时间: 2024-01-09 09:36:12 浏览: 116
当一个自定义注解标记为 `@Retention(RetentionPolicy.CLASS)` 时,它会在编译后的字节码中保留,但在运行时不可见。我们可以通过反射来获取注解并执行一些操作。
下面是一个简单的示例:
```java
import java.lang.annotation.*;
@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation {
String value();
}
public class MyClass {
@MyAnnotation("Hello")
public void myMethod() {
// do something
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
MyClass obj = new MyClass();
// 使用反射获取方法上的注解
Method method = MyClass.class.getMethod("myMethod");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
if (annotation != null) {
String value = annotation.value();
System.out.println("Value: " + value); // 输出:Value: Hello
}
}
}
```
在这个例子中,`MyAnnotation` 自定义注解被标记为 `@Retention(RetentionPolicy.CLASS)`。我们通过反射获取 `myMethod` 方法上的注解,并输出注解中的值。
而当一个自定义注解标记为 `@Retention(RetentionPolicy.RUNTIME)` 时,它会在运行时保留,并可以通过反射来获取和处理。
下面是一个简单的示例:
```java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String value();
}
public class MyClass {
@MyAnnotation("Hello")
public void myMethod() {
// do something
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
MyClass obj = new MyClass();
// 使用反射获取方法上的注解
Method method = MyClass.class.getMethod("myMethod");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
if (annotation != null) {
String value = annotation.value();
System.out.println("Value: " + value); // 输出:Value: Hello
}
}
}
```
在这个例子中,`MyAnnotation` 自定义注解被标记为 `@Retention(RetentionPolicy.RUNTIME)`。我们同样通过反射获取 `myMethod` 方法上的注解,并输出注解中的值。
这两个例子中的注解都可以通过反射访问,并根据需要执行相应的操作。区别在于 `@Retention(RetentionPolicy.CLASS)` 注解在运行时不可见,只能在编译后的字节码中通过反射来访问,而 `@Retention(RetentionPolicy.RUNTIME)` 注解在运行时可见,可以直接通过反射来访问。
阅读全文