










AI 概述
Java注解是以@开头的代码标签,分内置、自定义、元注解三类。它有SOURCE、CLASS、RUNTIME三种生命周期,可通过@Target限定作用范围。可借助反射在运行时、APT在编译时解析处理,广泛应用于Spring、Lombok等框架,也能实现权限校验、AOP等功能,简化开发。
目录

@Override(表示方法是重写的)和@Deprecated(表示方法不推荐再用)。@Retention和@Target这样的注解,用来设置其他注解的规则。SOURCE:只存在源代码里,编译后就没有了。CLASS:保留在字节码文件里,但运行时看不到。RUNTIME:保留在字节码里,程序运行时可以通过反射读取。@Override用来确保你重写的方法是正确的。Lombok用注解自动生成代码,减少手动写。注解 是用 @ 开头的一种结构,用来描述代码的额外信息。
示例:内置注解
@Override
public String toString() {
return "示例";
}
示例:自定义注解
@MyAnnotation(value = "测试注解")
public void testMethod() {}
解析:
注解本质是对代码的描述,最终由编译器、工具或运行时框架进行解析。
注解的生命周期由@Retention决定,可以分为三类:
示例代码
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // 生命周期为运行时
@interface MyAnnotation {
String value();
}
通过@Target定义注解的作用范围:
示例代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
@interface MyAnnotation {}
一个注解可以包含以下部分:
default 关键字指定。完整示例
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // 注解生命周期
@Target({ElementType.METHOD}) // 注解适用范围
@interface MyAnnotation {
String value() default "默认值"; // 成员变量
}
Java 的 反射机制 提供了运行时解析注解的能力。
示例:通过反射获取注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
// 自定义运行时注解
@Retention(RetentionPolicy.RUNTIME)
@interface Log {
String value() default "执行方法";
}
// 使用注解
class Demo {
@Log("执行 myMethod 方法")
public void myMethod() {
System.out.println("方法运行中...");
}
}
public class AnnotationReflection {
public static void main(String[] args) throws Exception {
// 获取方法上的注解
Method method = Demo.class.getMethod("myMethod");
if (method.isAnnotationPresent(Log.class)) {
Log log = method.getAnnotation(Log.class);
System.out.println("注解值:" + log.value());
}
// 调用实际方法
new Demo().myMethod();
}
}
输出结果:
注解值:执行 myMethod 方法 方法运行中...
注解处理器(Annotation Processing Tool, APT) 是 Java 提供的编译时工具,用于扫描和处理注解。
APT 工作流程
示例:APT 自动生成代码
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import java.io.*;
@SupportedAnnotationTypes("MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
String className = element.getSimpleName().toString();
try (Writer writer = processingEnv.getFiler()
.createSourceFile(className + "Generated")
.openWriter()) {
writer.write("public class " + className + "Generated {}");
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
}
解析:
通过 APT 可以在编译时自动生成代码,广泛用于框架开发。
(1) Spring 框架中的注解
@Autowired:自动装配依赖。@Transactional:声明事务。@Controller:标记控制器类。(2) Lombok 注解
Lombok 使用注解简化代码开发,例如:
@Getter和@Setter自动生成 getter/setter 方法。@Builder构造 Builder 模式。(3) 权限校验
通过自定义注解实现方法级别的权限控制。
示例:基于注解的权限校验
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface Permission {
String role();
}
class UserController {
@Permission(role = "ADMIN")
public void deleteUser() {
System.out.println("用户已被删除");
}
}
元注解是控制注解行为的注解,例如:
RetentionPolicy 决定注解生命周期。ElementType 限定注解的使用范围。动态代理结合注解可实现 AOP(面向切面编程)。例如:
推荐阅读:
详解 Java 实体类的注解 @Data@NoArgsConstructor@AllArgsConstructor@ToString
以上关于Java注解的实现原理是什么?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
「点点赞赏,手留余香」
赞 0 赏
给作者打赏,鼓励TA抓紧创作!
微信
支付宝
还没有人赞赏,快来当第一个赞赏的人吧!
声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Java注解的实现原理是什么?
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。