当前位置: 首页 > article >正文

JAVA中如何自定义注解

Java中的注解是一种特殊的修饰符,它可以被附加到类、方法、变量、参数等上面,用于传递元数据。自定义注解可以让开发者创建具有特定功能的注解,提高代码的可读性和可维护性。

一、自定义注解的基本步骤

  1. 定义注解接口
  2. 使用元注解修饰注解接口
  3. 编写注解处理器
  4. 在代码中使用注解
  5. 运行注解处理器,查看运行结果

二、代码例子

  1. 定义注解接口 以下是一个简单的自定义注解例子,用于标记方法执行时间:

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 "";
}
  1. 使用元注解修饰注解接口 在上面的代码中,我们使用了两个元注解:@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:包

  1. 编写注解处理器 注解处理器用于解析注解并执行相关操作。以下是一个简单的注解处理器,用于计算方法的执行时间:

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");
            }
        }
    }
}
  1. 在代码中使用注解 以下是一个使用@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();
        }
    }
}
  1. 运行注解处理器,查看运行结果

public class Main {
    public static void main(String[] args) throws Exception {
        TimeCostProcessor.process("TestClass");
    }
}

运行结果:

testMethod1 方法执行时间:100ms
testMethod2 方法执行时间:200ms

三、总结

通过以上步骤,我们成功自定义了一个注解@TimeCost,并编写了注解处理器来计算方法的执行时间。在实际开发中,我们可以根据需求自定义更多功能强大的注解,提高代码的可读性和可维护性。


http://www.kler.cn/a/285071.html

相关文章:

  • Docker Compose部署Rabbitmq(脚本下载延迟插件)
  • windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576
  • 「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用
  • Java-字符串常量池
  • 游戏中Dubbo类的RPC设计时的注意要点
  • MongoDB 基础与应用
  • Docker compose 安装 ELK
  • 【电力电子】单相并网逆变器
  • 在Vue2中使用WebSocket
  • C语言基础(二十一)
  • CSS3换装达人原理
  • 【Datawhale AI夏令营】从零上手CV竞赛Task3
  • 惠中科技PV-Wiper全自动光伏清洁系统,根治污染难题
  • 2024最详细Maven配置教程
  • Java算法之归并排序(Merge Sort)
  • 【Godot4.3】MarkDown解析和生成类 - MDdoc
  • 仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸
  • 在Ubuntu 20.04上安装MySQL的方法
  • 神经网络搭建实战与Sequential的使用
  • 南京观海微电子----VCC、 VDD、VSS、VEE 电压符号解释
  • <Rust>egui学习之小部件(八):如何在窗口中添加滑动条slider部件?
  • Vue.js入门系列(十九):深入理解和应用组件自定义事件
  • C++宏展开
  • 2024.08.28 C++初学
  • Notepad++回车不自动补全
  • Python算法工程师面试整理-概率与统计