功能篇:JAVA实现自定义注解
在Java中创建自定义注解可以通过使用`@interface`关键字来完成。自定义注解可以包含元素(即参数),并且你可以指定这些元素的默认值、保留策略以及应用的目标。以下是实现自定义注解的基本步骤和示例代码。
### 自定义注解的组成部分
1. **元素(成员)**:注解可以有零个或多个元素,它们类似于方法声明,但没有方法体。每个元素必须有一个默认值或者在使用时提供具体的值。
2. **默认值**:可以为注解的元素设置默认值,这样在使用该注解时可以省略这些元素。
3. **元注解**:用于描述注解的注解称为元注解。常用的元注解包括:
- `@Retention`:定义了该注解的生命周期。
- `@Target`:定义了该注解可以应用于哪些程序元素。
- `@Documented`:表明该注解应该被javadoc工具记录。
- `@Inherited`:表明该注解可以被子类继承。
4. **保留策略 (`RetentionPolicy`)**
- `SOURCE`:注解仅存在于源代码级别,在编译时会被丢弃。
- `CLASS`:注解会在class文件中存在,但在运行时不会被虚拟机保留。
- `RUNTIME`:注解会在运行时由虚拟机保留,因此可以通过反射机制读取。
### 示例代码
#### 1. 创建自定义注解
```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 定义注解的生命周期为运行时
@Retention(RetentionPolicy.RUNTIME)
// 定义注解可以应用于方法和类型
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface CustomAnnotation {
// 注解的元素
String value() default "Default Value"; // 默认值
int id() default -1; // 可选元素,带默认值
String[] tags() default {}; // 数组类型的元素,默认为空数组
}
```
#### 2. 使用自定义注解
接下来,你可以在类或方法上使用这个自定义注解:
```java
@CustomAnnotation(value = "This is a custom annotation", id = 1001, tags = {"tag1", "tag2"})
public class MyClass {
@CustomAnnotation("Method level annotation")
public void myMethod() {
System.out.println("Executing method with custom annotation.");
}
}
```
#### 3. 通过反射获取注解信息
为了在运行时处理自定义注解,你需要使用Java的反射API。下面是一个简单的例子,展示了如何读取并打印出类和方法上的自定义注解信息:
```java
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void main(String[] args) throws Exception {
Class<?> clazz = MyClass.class;
// 检查类级别的注解
if (clazz.isAnnotationPresent(CustomAnnotation.class)) {
CustomAnnotation classAnnotation = clazz.getAnnotation(CustomAnnotation.class);
printAnnotationInfo(classAnnotation, "Class");
}
// 检查方法级别的注解
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(CustomAnnotation.class)) {
CustomAnnotation methodAnnotation = method.getAnnotation(CustomAnnotation.class);
printAnnotationInfo(methodAnnotation, "Method: " + method.getName());
}
}
}
private static void printAnnotationInfo(CustomAnnotation annotation, String prefix) {
System.out.println(prefix + " - Value: " + annotation.value());
System.out.println(prefix + " - ID: " + annotation.id());
System.out.print(prefix + " - Tags: ");
for (String tag : annotation.tags()) {
System.out.print(tag + " ");
}
System.out.println();
}
}
```
这段代码会输出所有带有`CustomAnnotation`注解的类和方法的信息。请注意,为了访问运行时注解,必须确保注解的保留策略是`RUNTIME`。
通过这种方式,你可以根据需要创建各种各样的自定义注解,并利用它们来增强代码的功能性和可读性。