5. 「Java 」江山基础之注解入门

简介: 5. 「Java 」江山基础之注解入门

前言:Java注解是一种非常强大的语法元素,可以为我们的程序带来很多便利。然而,在使用注解时,我们往往会遇到一些问题。本篇博客将系统地介绍Java注解的定义、作用、使用方法以及注意事项,帮助大家更好地掌握Java注解,并在实际开发中运用自如。


文章目录


🚀 作者简介:作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职业生涯中积累了丰富的经验,希望能通过这个博客与大家交流、学习和成长。技术栈:Java、PHP、Python、Vue、React


本文收录于三木的🎈 「Java探索者之路」系列专栏,这个专栏旨在引领Java开发者踏上一段真正探索Java世界的旅程。

我们将深入探讨Java编程的方方面面,从基础知识到高级技巧,从实践案例到最新趋势,帮助你成为一名卓越的Java探索者。如果有想进入Java后端领域工作的同学,这个专栏会对你有所帮助,欢迎关注起来呀

🔥「面试」这个专栏的灵感来自于许多粉丝私信,大家向我咨询有关面试的问题和建议。我深感荣幸和责任,希望通过这个专栏,能够为大家提供更多关于面试的知识、技巧和经验。我们将一起探讨面试。期待粉丝们ssp的offer喜讯。

🌼 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中,大家感兴趣的可以关注一下我的「AI」专栏


🌹一起学习,互三互访,顺评论区有访必回,有关必回!!!


从入门到精通:Java注解详解

前言

Java注解是一种非常强大的语法元素,可以为我们的程序带来很多便利。然而,在使用注解时,我们往往会遇到一些问题。本篇博客将系统地介绍Java注解的定义、作用、使用方法以及注意事项,帮助大家更好地掌握Java注解,并在实际开发中运用自如。

Java注解是什么?

Java注解是一种元数据,它提供了一种在程序中添加元数据的方式,这些元数据可以用于编译时的检查、运行时的检查、代码生成,甚至是代码分析和优化等。

Java注解的作用

Java注解的作用主要有以下方面:

  • 提供编译器额外的代码检查
  • 在运行时进行一些额外的操作
  • 通过代码生成器自动生成代码

Java注解的使用方法

Java注解可以用在类、接口、方法、参数、字段等地方,对于不同的使用场景,使用方法也略有不同。

定义注解

定义注解使用 @interface 关键字。

public @interface MyAnnotation {
}

使用注解

使用注解可以使用 @ 注解名 的方式,在类、接口、方法、参数、字段等地方添加注解。

@MyAnnotation
public class MyClass {
    @MyAnnotation
    private String myField;
    @MyAnnotation
    public void myMethod(@MyAnnotation String myParam) {
    }
}

注解元素

注解元素可以理解为注解的属性,在定义注解时,可以为注解添加元素。

public @interface MyAnnotation {
    String name();
    int age();
}

使用注解时,必须为元素赋值。

@MyAnnotation(name = "张三", age = 18)
public class MyClass {
}

注解生命周期

Java注解可以有三种生命周期:

  • 源码级别:注解只在源码中存在,编译时会被丢弃
  • 编译时:注解在编译时被保留,但不会包含在编译后的class文件中
  • 运行时:注解在运行时被保留,并且可以通过反射机制读取

指定注解生命周期可以使用 @Retention 注解。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

元注解

元注解是指用于注解其他注解的注解。Java中定义了4个元注解,分别是 @Retention、@Target、@Documented、@Inherited。

  • @Retention:用于指定注解的生命周期
  • @Target:用于指定注解可以应用的元素类型
  • @Documented:用于指定注解是否包含在JavaDoc中
  • @Inherited:用于指定注解是否可以被继承

纸上得来终觉浅

下面我将用一个简单的例子来演示如何使用Java注解如何在spring 中实现时间监控。

好的,下面我将用一个简单的例子来演示如何使用Java注解实现时间监控。

我们通过注解来标记要进行时间监控的方法,然后在方法调用的前后获取时间差,进而实现时间监控的功能。

1. 定义注解

首先,我们需要定义一个注解来标记要进行时间监控的方法。这个注解可以命名为 @TimeMonitor。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeMonitor {
}

上面的代码中,我们定义了一个只能用在方法上的注解,注解名称为 @TimeMonitor。

2. 实现时间监控

我们创建一个 TimeMonitorAspect 类,并使用 AspectJ 提供的 @Aspect 注解来标记这是一个切面类。然后,在这个类中,我们定义一个环绕通知方法 timeMonitor,用来进行时间监控。

在 timeMonitor 方法中,我们首先获取当前方法调用的时间,然后执行方法本身,最后再获取方法执行完成后的时间。通过计算这两个时间差,我们就可以得出该方法的执行时间了。

@Aspect
public class TimeMonitorAspect {
    @Around("@annotation(com.example.annotationdemo.TimeMonitor)")
    public Object timeMonitor(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println(joinPoint.getSignature() + " 方法执行时间:" + (endTime - startTime) + "ms");
        return result;
    }
}

3. 测试时间监控

最后,我们创建一个测试类 TestTimeMonitor,用来测试时间监控的效果。

在这个类中,我们定义了两个方法,其中的注解 @TimeMonitor 就是用来标记进行时间监控的方法。

public class TestTimeMonitor {
    @TimeMonitor
    public static void method1() throws InterruptedException {
        Thread.sleep(100);
    }
    @TimeMonitor
    public static void method2() throws InterruptedException {
        Thread.sleep(200);
    }
    public static void main(String[] args) throws InterruptedException {
        method1();
        method2();
    }
}

当我们运行 TestTimeMonitor 的 main 方法时,控制台输出的内容应该如下所示:

void com.example.annotationdemo.TestTimeMonitor.method1() 方法执行时间:100ms
void com.example.annotationdemo.TestTimeMonitor.method2() 方法执行时间:200ms

从输出的结果中,我们可以看到通过使用 @TimeMonitor 注解,我们成功地实现了时间监控的功能。

4. 时间监控小结

通过这个简单的例子,我们可以看到使用 Java 注解可以极大地方便我们对程序进行更细致的控制和管理,实现类似时间监控的功能非常简单。

注意事项

在使用Java注解时,需要注意以下事项:

  • 注解不能够继承其他的类或者注解
  • 注解的元素必须要有值
  • 注解中元素的类型只能是基本类型、String、Class、枚举类型、注解类型以及以上类型的数组
  • 注解中元素的默认值需要使用 default 关键字指定

总结

Java注解是一种非常强大的语法元素,它可以为我们带来很多便利,但在使用注解时也需要注意一些事项。希望通过本篇博客,大家能够更好地掌握Java注解的定义、作用、使用方法以及注意事项,并在实际开发中运用自如。

相关文章
|
4天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
10天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
20天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
43 14
|
20天前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
29 12
|
16天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
54 5
|
14天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
29 1
|
20天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
43 3
|
22天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
14天前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
27 0
|
6月前
|
安全 Java 编译器
Java其他: 什么是Java中的注解(Annotation)?
Java其他: 什么是Java中的注解(Annotation)?
80 0