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注解的类型可以分为三类:
1.标准注解
Java标准注解包括:@Override、@Deprecated、@SuppressWarnings等,它们提供了一些常用的元数据,可以帮助程序员更好地组织和管理代码。
2.元注解
Java元注解是用来注解其他注解的注解,它们包括:@Retention、@Target、@Documented、@Inherited等。
Java元注解主要用来:控制注解的作用域、保留期限、文档化等。
3.自定义注解
Java自定义注解是程序员自己定义的注解,可以用来描述特定的行为或状态。
Java自定义注解可以应用于:类、方法、变量、参数等程序元素,以提供额外的信息和指令。
标准注解
Java标准注解包括:@Override、@Deprecated、@SuppressWarnings、@FunctionalInterface等。
如下图所示:
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等。
如下图所示:
1.@Retention元注解
@Retention用于指定注解的生命周期,它的取值包括:
- 在源代码中(SOURCE);
- 类文件中(CLASS);
- 或者运行时(RUNTIME);
详细描述,如下图所示:
2.@Documented元注解
@Documented用于:指定注解是否应该被包含在JavaDoc中。
3.@Target元注解
@Target用于指定注解的作用范围,即:被描述的注解可以用在什么地方。
@Target的取值包括,如下图所示:
4.@Inherited元注解
@Inherited注解:说明子类可以继承父类中的该注解。
5.@Repeatable注解
@Repeatable表示:注解可以重复使用。
在Java 8之前,注解是不能重复使用的,但Java 8引入了@Repeatable元注解,可以让注解被重复使用。
Java自定义注解
Java允许开发者自定义注解,Java自定义注解可以用于标记特定的程序元素。
Java自定义注解语法格式:
// 元注解 public @interface 注解名称{ // 属性列表 }
- @interface 关键字:用来定义一个注解,其后面紧跟着注解的名称。
- 元素:注解可以包含多个元素,用来表示注解的属性。每个元素由其名称、类型和默认值组成。
如何定义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注解的常见应用包括:
- 在编译时进行格式检查,比如:@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
- 在Spring框架中,注解用来描述依赖注入、事务管理、AOP等行为。
- 在JUnit测试框架中,注解用来描述测试方法、测试类、测试套件等。
- 在JPA持久化框架中,注解用来描述实体、关联关系、查询等。
以上就是Java注解详解,希望对你掌握Java注解有所帮助!
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》