全面剖析java中的注解(Annotation)

全面剖析Java中的注解(Annotation)

1. 什么是注解

注解(Annotation),是Java 5之后引入的一个重要特性。它是Java语言旨在简化Java开发的一种方式,是代码级别的说明标记,用于描述类、方法、变量等元素的信息。

注解本身并没有实际的执行逻辑,它只是代码的一种附加说明、标记或元数据,提供了一种结构化的方式来描述程序和配置信息。注解可以通过反射机制获取,从而完成代码分析、动态代理、单元测试等功能。

常见的注解有:@Override、@Deprecated、@SuppressWarnings等。

2. 注解的使用

注解用于描述程序和配置信息,可以应用于Java源代码中的多个元素。

2.1 声明注解

public @interface MyAnnotation {
    String name() default "defaultName";
    int age() default 0;
}

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

2.2 应用注解

2.2.1 类注解的使用

@MyAnnotation(name="Tom",age=20)
public class MyClass {
    ...
}

在类上应用注解 MyAnnotation,并指定 nameage 的值。

2.2.2 方法注解的使用

public class MyClass {

    @MyAnnotation(name="Tom",age=20)
    public void myMethod() {
        ...
    }
}

在方法上应用注解 MyAnnotation,并指定 nameage 的值。

3. 注解的元素

注解可以有多个元素,每个元素就是一个变量,类似于接口中的方法,可以带默认值。元素的声明方式类似于方法声明:

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

3.1 元素带默认值

public @interface MyAnnotation {
    String name() default "defaultName";
    int age() default 0;
}

元素 nameage 带有默认值 "defaultName"0

3.2 元素带数组类型

public @interface MyAnnotation {
    String[] tags() default {};
}

元素 tags 是一个字符串数组类型,带有默认值 {}

3.3 元素带枚举类型

public enum Gender {
    MALE,FEMALE,OTHER;
}

public @interface MyAnnotation {
    Gender gender() default Gender.OTHER;
}

元素 gender 是一个枚举类型 Gender,带有默认值 Gender.OTHER

4. 注解的生命周期

注解的生命周期是指注解存在的期限。Java中的注解有三种生命周期:源码级别(@Retention(RetentionPolicy.SOURCE))、类文件级别(@Retention(RetentionPolicy.CLASS))、运行时级别(@Retention(RetentionPolicy.RUNTIME))。

4.1 源码级别

@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
    String name() default "defaultName";
    int age() default 0;
}

在源码级别上声明的注解只存在于源代码中,在编译时会被丢弃。

4.2 类文件级别

@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
    String name() default "defaultName";
    int age() default 0;
}

在类文件级别上声明的注解存在于编译后的字节码中,但在运行时不会被JVM加载。

4.3 运行时级别

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String name() default "defaultName";
    int age() default 0;
}

在运行时级别上声明的注解存在于编译后的字节码中,且在运行时也会被JVM加载,并提供相应的反射方法调用。

5. 示例

5.1 spring中的注解

Spring框架中广泛使用注解来描述Bean之间的依赖关系和声明Bean的行为。例如:@Autowired、@Component、@Configuration、@Bean等。

@Configuration
public class MyConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Component
public class MyController {

    @Autowired
    private MyService myService;

    ...
}

使用 @Configuration 注解声明一个配置类,并使用 @Bean 注解声明一个Bean,在 MyController 类中使用 @Autowired 注解自动注入 MyService 实例。

5.2 lombok中的注解

Lombok是一个Java库,它通过注解的方式在编译期自动生成Java类的getter、setter、toString、equals等方法,以简化Java开发,提高开发效率。

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}

@NoArgsConstructor
@AllArgsConstructor
public class MyException extends RuntimeException {
    private String code;
    private String message;
}

使用 @Data 注解自动生成getter、setter、toString等方法,在 MyException 中使用 @NoArgsConstructor@AllArgsConstructor 注解自动生成无参构造方法和全参构造方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:全面剖析java中的注解(Annotation) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring5新特性之Reactive响应式编程

    Spring5新特性之Reactive响应式编程攻略 什么是Reactive响应式编程 传统的编程模型是同步阻塞的,即当程序调用一个方法时,调用者会一直等待该方法执行完毕并返回结果后,才能继续执行后续的操作。这种模型的问题在于,当方法执行时间过长或者被调用的方法处于阻塞状态时,整个应用程序都会处于等待状态,不能及时响应用户的请求,影响了程序的运行效率以及用户…

    Java 2023年5月19日
    00
  • SpringBoot集合Mybatis过程解析

    SpringBoot集成Mybatis过程解析 1. 简介 SpringBoot是基于Spring框架的快速应用开发框架,整合了众多好用的组件,非常适合开发中小型项目。而Mybatis则是一个轻量级的ORM框架,可以让我们更加方便地操作数据库。 在本篇攻略中,我们将会详细讲解如何在SpringBoot项目中集成Mybatis,并完成对数据库的CRUD操作。 …

    Java 2023年5月19日
    00
  • java实现简单的验证码功能

    以下是Java实现简单验证码功能的攻略: 步骤一:生成验证码 导入相关类库。需要导入Java中的BufferedImage、Graphics、Color和Random。 import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import ja…

    Java 2023年5月19日
    00
  • java compare compareTo方法区别详解

    Java CompareTo方法区别详解 什么是Java CompareTo方法? CompareTo()是Java中一个比较方法,用于对两个对象进行比较。在Java中,对象可以比较大小。如果Object A比Object B大,则compareTo()会返回一个正值。如果Object A比Object B小,则compareTo()会返回一个负的值。如果两…

    Java 2023年5月26日
    00
  • Java实战小技巧之数组与list互转

    可以按照以下步骤将Java数组和List进行互相转换: 将数组转换为List 使用Arrays类的asList方法将数组转换为List java String[] array = {“a”, “b”, “c”}; List<String> list = Arrays.asList(array); 这里将String类型的数组转换为List类型的列…

    Java 2023年5月26日
    00
  • Gson之toJson和fromJson方法的具体使用

    标题: Gson之toJson和fromJson方法的具体使用攻略 概述:GSON 是 Google 提供的 JSON 库,在 Android 应用开发中是经常被用到的,在实现 JSON 的序列化和反序列化时会用到 toJson() 和 fromJson() 方法。 toJson() 方法是将 Java 对象转换成 JSON 对象,而fromJson() 方…

    Java 2023年5月26日
    00
  • CAS的service参数验证

    CAS登录成功后会跳转到service参数提供的url,目前系统中这个参数是没有任何验证的,service参数随便赋一个网址就可以。为安全起见现在对这个service要作一下限制,比如只能是同源url才可以重定向。 下面是基于CAS 3.5.2对系统的改造过程。 系统比较老旧,之前也作过CAS方面的改造,基本思路是从login-webflow.xml中找到切…

    Java 2023年4月23日
    00
  • 关于Maven的使用,这些你都真的了解么

    关于Maven的使用,这些你都真的了解么 什么是Maven? Maven是一个基于项目对象模型(POM),可以通过一小段描述文件来管理项目构建、依赖管理和文档编制等的工具。它可以帮助开发者快速构建Java项目。 Maven的安装 要使用Maven,需要先安装Maven。 以下是在Windows操作系统上安装Maven的方法: 去 Maven官网 下载Mave…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部