Java注解 java annotation

Java 注解(Annotation) 是 Java 5 引入的一种元数据(Metadata)机制,主要用于提供代码的额外信息,可以在编译时运行时发挥作用。它广泛用于 Spring、MyBatis、JUnit、Lombok 等框架。

  • Annotation的作用:不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)。可以被其它程序(比如编译器等)读取。
  • Annotation的格式:注解是以@注释名在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")
  • Annotation在哪里使用?

可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制变成实现对这些元数据的访问。

1. 注解的作用

Java 注解通常用于:

  • 编译检查(如 @Override 确保方法正确重写)
  • 代码生成(如 @Getter@Setter 生成 getter/setter 方法)
  • 运行时反射(如 Spring 中的 @Autowired 注入依赖)
  • AOP(面向切面编程)(如 @Transactional 事务管理)

2. 内置注解举例

img

3. 元注解

img

元注解用于定义注解,主要有:

注解 作用
@Retention 指定注解的生命周期(SOURCE / CLASS / RUNTIME)
@Target 限制注解使用范围(类、方法、字段等)
@Documented 让注解出现在 Javadoc 文档中
@Inherited 允许子类继承父类的注解

4. 自定义元注解

img

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.ryan.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义注解
public class Test {
// 注解可以显式赋值,如果没有默认值,则必须给注解赋值
@MyAnnotation(name = "ryan", schools = {"北大, 清华"})
public void test() {}

@MyAnnotation1("ryan")
public void test1() {}
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
// 注解的参数:参数类型 + 参数名();
String name() default "";
int age() default 0;
int id() default -1; //如果默认值为-1,代表不存在
String[] schools();
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1 {
// 注解只有一个值时,建议使用value();
String value();
}