一、注解基础回顾
注解(@Annotation)是Java 5引入的元数据机制,用于为类、方法、字段等元素添加标记或配置信息,本身不影响代码逻辑,需借助外部工具(如编译器、框架或反射API)处理。
二、反射操作注解的核心API
反射包java.lang.reflect提供关键接口和类:
· AnnotatedElement接口:Class、Method、Field等均实现此接口
· 核心方法:
· getAnnotation(Class):获取指定类型注解 · getAnnotations():获取所有注解 · isAnnotationPresent(Class):判断注解是否存在
三、实战示例:定义并解析自定义注解
1. 定义注解
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可见
@Target(ElementType.METHOD) // 注解作用于方法
public @interface ApiEndpoint {
String path(); // 注解属性
String method() default "GET"; // 带默认值的属性
}
- 使用注解标记目标方法
public class UserController {
@ApiEndpoint(path = "/user/info", method = "GET")
public void getUserInfo() {
System.out.println("Returning user info...");
}
}
2. 反射解析注解(核心)
import java.lang.reflect.Method;
public class AnnotationParser {
public static void main(String[] args) {
// 遍历目标类所有方法
for (Method method : UserController.class.getDeclaredMethods()) {
// 检查方法是否被@ApiEndpoint标记
if (method.isAnnotationPresent(ApiEndpoint.class)) {
ApiEndpoint endpoint = method.getAnnotation(ApiEndpoint.class);
// 动态获取注解属性值
System.out.println("Found API Endpoint:");
System.out.println("Path: " + endpoint.path());
System.out.println("HTTP Method: " + endpoint.method());
System.out.println("Target Method: " + method.getName());
}
}
}
}
输出结果:
Found API Endpoint:
Path: /user/info
HTTP Method: GET
Target Method: getUserInfo
四、典型应用场景
- 框架开发
Spring MVC 通过 @RequestMapping 映射URL(原理同示例) - 依赖注入
Spring 的 @Autowired 利用反射查找并注入Bean - 数据校验
JSR-303 的 @NotNull、@Size 结合反射实现自动验证 - 序列化/反序列化
Jackson 的 @JsonProperty 控制JSON字段映射
性能提示:反射操作有开销,高频场景建议缓存 Annotation 对象(如将Method与对应注解存入ConcurrentHashMap)。
结语
反射赋予Java注解动态生命力,使其从“静态标记”升级为“运行时指令”。深入理解反射操作注解的机制,开发者能更自如地构建高扩展性架构(如自定义框架、自动化工具)。掌握此“黑科技”,代码的灵活性与表现力将大幅跃升!

被折叠的 条评论
为什么被折叠?



