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)
public @interface TimeCost {
String value() default "";
}
-
使用元注解修饰注解接口 在上面的代码中,我们使用了两个元注解:@Retention和@Target。
- @Retention:表示注解的生命周期,有三种策略:
-
SOURCE:源文件保留,编译后丢弃
-
CLASS:编译到class文件中,运行时忽略
-
RUNTIME:编译到class文件中,运行时可通过反射获取
-
- @Target:表示注解可以用于哪些元素,常用的有:
-
ElementType.TYPE:类、接口、枚举
-
ElementType.FIELD:字段、枚举常量
-
ElementType.METHOD:方法
-
ElementType.PARAMETER:参数
-
ElementType.CONSTRUCTOR:构造方法
-
ElementType.LOCAL_VARIABLE:局部变量
-
ElementType.ANNOTATION_TYPE:注解类型
-
ElementType.PACKAGE:包
-
-
编写注解处理器 注解处理器用于解析注解并执行相关操作。以下是一个简单的注解处理器,用于计算方法的执行时间:
import java.lang.reflect.Method;
public class TimeCostProcessor {
public static void process(String className) throws Exception {
Class<?> clazz = Class.forName(className);
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(TimeCost.class)) {
TimeCost timeCost = method.getAnnotation(TimeCost.class);
long startTime = System.currentTimeMillis();
method.invoke(clazz.newInstance());
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + " 方法执行时间:" + (endTime - startTime) + "ms");
}
}
}
}
-
在代码中使用注解 以下是一个使用@TimeCost注解的类:
public class TestClass {
@TimeCost("测试方法1")
public void testMethod1() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@TimeCost("测试方法2")
public void testMethod2() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
-
运行注解处理器,查看运行结果
public class Main {
public static void main(String[] args) throws Exception {
TimeCostProcessor.process("TestClass");
}
}
运行结果:
testMethod1 方法执行时间:100ms
testMethod2 方法执行时间:200ms
三、总结
通过以上步骤,我们成功自定义了一个注解@TimeCost,并编写了注解处理器来计算方法的执行时间。在实际开发中,我们可以根据需求自定义更多功能强大的注解,提高代码的可读性和可维护性。