Java注解全面详解(万字图文总结)

Java注解全面详解(万字图文总结)-mikechen

Java注解是Java非常重要的特性,而且是Java面试必考的内容,下面我就全面来详解Java注解@mikechen

Java注解定义

Java注解是一种元数据,可以在源代码中添加元素的额外信息,使得代码更加具有可读性和可维护性。

Java注解可以应用于类、方法、变量、参数等程序元素,以提供额外的信息和指令。

 

Java注解作用

Java注解的作用主要包括以下几个方面:

1.提供编译时检查和运行时解析功能

Java注解可以在编译时进行检查和处理,这有助于开发者在编写代码时发现潜在的问题,避免在运行时出现错误。

2.提供一种声明式的编程方式

Java注解可以在代码中声明元数据信息,让开发者在代码中使用声明式的方式来表达程序元素的属性和行为。

3.提供一种自动化的文档生成方式

Java注解可以用于生成文档,让开发者能够快速生成程序的API文档,并且这种文档是自动化生成的,减少了文档编写的工作量。

4.提供一种扩展性的机制

Java注解可以用于扩展现有的Java程序,例如:在Spring框架中使用注解来实现Spring依赖注入Spring AOP等功能等。

 

Java注解分类

Java注解全面详解(万字图文总结)-mikechen

Java注解的类型可以分为三类:

1.标准注解

Java标准注解包括:@Override、@Deprecated、@SuppressWarnings等,它们提供了一些常用的元数据,可以帮助程序员更好地组织和管理代码。

 

2.元注解

Java元注解是用来注解其他注解的注解,它们包括:@Retention、@Target、@Documented、@Inherited等。

Java元注解主要用来:控制注解的作用域、保留期限、文档化等。

 

3.自定义注解

Java自定义注解是程序员自己定义的注解,可以用来描述特定的行为或状态。

Java自定义注解可以应用于:类、方法、变量、参数等程序元素,以提供额外的信息和指令。

 

标准注解

Java标准注解包括:@Override、@Deprecated、@SuppressWarnings、@FunctionalInterface等。

如下图所示:

Java注解全面详解(万字图文总结)-mikechen

1.@Override注解

在Java中@Override注解用于表示一个方法是覆盖,或实现了父类或接口中的方法,它可以帮助开发人员更容易地找到代码中的错误。

示例如下:

public class Animal {
    public void move() {
        System.out.println("Animal is moving...");
    }
}

public class Dog extends Animal {
    @Override
    public void move() {
        System.out.println("Dog is running...");
    }
}

 

2.@Deprecated注解

@Deprecated注解用于表示某个方法或类已经不推荐使用,通常是因为它已经过时或者存在更好的实现。

当一个方法或类被标记为@Deprecated时,编译器会发出警告,提醒开发人员不要使用它。

示例如下:

@Deprecated
public class OldClass {
    public void oldMethod() {
        System.out.println("This method is deprecated.");
    }
}

 

3.@SuppressWarnings注解

@SuppressWarnings注解用于告诉编译器忽略某些警告,这可以在一些特殊情况下很有用。

public class MyCode {
    @SuppressWarnings("deprecation")
    public void doSomething() {
        OldClass old = new OldClass();
        old.oldMethod();
    }
}

 

4.@FunctionalInterface注解

@FunctionalInterface注解用于表示某个接口只有一个抽象方法,可以被用作函数式接口。

示例如下:

@FunctionalInterface
public interface MyFunction {
    int apply(int x, int y);
}

 

Java元注解

Java元注解是用于修饰注解的注解,Java提供了一些元注解,用于指定注解的作用范围、生命周期、目标等信息。

Java元注解包括:@Retention、@Target、@Documented、@Inherited、@Repeatable等。

如下图所示:

Java注解全面详解(万字图文总结)-mikechen

1.@Retention元注解

@Retention用于指定注解的生命周期,它的取值包括:

  • 在源代码中(SOURCE);
  • 类文件中(CLASS);
  • 或者运行时(RUNTIME);

详细描述,如下图所示:

Java注解全面详解(万字图文总结)-mikechen

 

2.@Documented元注解

@Documented用于:指定注解是否应该被包含在JavaDoc中。

 

3.@Target元注解

@Target用于指定注解的作用范围,即:被描述的注解可以用在什么地方。

@Target的取值包括,如下图所示:

Java注解全面详解(万字图文总结)-mikechen

4.@Inherited元注解

@Inherited注解:说明子类可以继承父类中的该注解。

 

5.@Repeatable注解

@Repeatable表示:注解可以重复使用。

在Java 8之前,注解是不能重复使用的,但Java 8引入了@Repeatable元注解,可以让注解被重复使用。

 

Java自定义注解

Java允许开发者自定义注解,Java自定义注解可以用于标记特定的程序元素。

Java自定义注解语法格式:

// 元注解
public @interface 注解名称{
    // 属性列表
}
  1. @interface 关键字:用来定义一个注解,其后面紧跟着注解的名称。
  2. 元素:注解可以包含多个元素,用来表示注解的属性。每个元素由其名称、类型和默认值组成。

如何定义Java自定义注解:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "Hello";
    int num() default 100;
}

注解定义说明:

  • @Retention(RetentionPolicy.RUNTIME):指定注解的生命周期为运行时。
  • @Target(ElementType.METHOD):指定注解的作用目标为方法。

public @interface MyAnnotation:定义注解类型名称为MyAnnotation。

注解元素定义说明:

String value() default “Hello”:定义一个字符串类型的元素value,默认值为”Hello”。

int num() default 100:定义一个整型类型的元素num,默认值为100。

 

Java自定义注解使用:

在代码中使用注解,可以通过@MyAnnotation来使用定义的自定义注解。

@MyAnnotation(value="world", num=200)
public void test() {
    // do something
}

 

Java注解原理

Java注解原理主要基于Java反射机制,主要体现在三个方面:

首先:当一个类或者方法被注解标记;

其次:在编译期间,Java编译器会将这些注解转换为Java字节码中的注解信息,并将这些信息存储在class文件中;

最后:当运行时,这些注解信息可以被反射机制读取并进行处理,实现了对程序的控制。

 

Java注解应用

Java注解的常见应用包括:

  1. 在编译时进行格式检查,比如:@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
  2. 在Spring框架中,注解用来描述依赖注入、事务管理、AOP等行为。
  3. 在JUnit测试框架中,注解用来描述测试方法、测试类、测试套件等。
  4. 在JPA持久化框架中,注解用来描述实体、关联关系、查询等。

以上就是Java注解详解,希望对你掌握Java注解有所帮助!

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法