注解的本质
在 Java 开发中,@Override、@Deprecated 这些标记随处可见。它们就是注解——一种给代码元素'贴标签'的机制。注解本身不直接参与执行,但能通过编译器或框架赋予代码额外含义。
自定义注解让我们能根据业务需求创建专属标签,结合反射机制可实现日志记录、权限校验、ORM 映射等动态逻辑。本文将深入讲解自定义注解的定义、元注解的作用,以及如何通过反射让注解真正'生效'。
自定义注解的基础语法
自定义注解使用 @interface 关键字定义,本质上是一种特殊的接口(编译后会生成继承 java.lang.annotation.Annotation 的接口)。
最简单的注解没有任何属性,仅作为标记使用:
public @interface MyFirstAnnotation { }
可以直接标注在类、方法等元素上:
@MyFirstAnnotation
public class Demo {
@MyFirstAnnotation
public void test() {}
}
注解也可以包含'属性',类似接口的抽象方法,使用时需要为属性赋值(除非有默认值):
public @interface UserInfo {
String name();
int age() default 18;
String[] hobbies() default {"coding"};
}
使用时的语法是属性名 = 值:
@UserInfo(name = "张三", age = 20, hobbies = {"篮球", "游戏"})
public class Person {}
这里有两个特殊规则需要注意:如果属性名是 value,且只有这一个属性需要赋值,可省略属性名;数组属性若只有一个元素,也可省略大括号。
元注解:控制注解的行为
元注解是用于修饰注解的注解,规定了自定义注解的使用范围、生命周期等特性。Java 内置了四种元注解:@Target、@Retention、@Documented、@Inherited。
@Target:指定注解能修饰哪些元素
@Target 限制注解可标注的目标(如类、方法、字段等),参数是 ElementType 枚举数组。常用值包括 TYPE(类、接口、枚举)、METHOD(方法)、FIELD(成员变量)等。
示例中我们限制注解只能用于类和方法:
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
Log { }


