跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
注解原理与应用
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:注解原理与应用}} == 简介 == '''注解(Annotation)'''是Java 5引入的一种元数据机制,用于为代码提供附加信息。注解本身不直接影响程序逻辑,但可以通过反射或编译器处理实现特定功能(如代码生成、配置管理、框架集成等)。 === 核心特性 === * '''编译时处理''':通过APT(Annotation Processing Tool)生成代码(如Lombok的<code>@Data</code>)。 * '''运行时反射''':通过<code>java.lang.reflect</code>读取注解信息(如Spring的<code>@Autowired</code>)。 * '''标记与配置''':简化代码声明(如<code>@Override</code>、<code>@Deprecated</code>)。 == 注解原理 == === 注解的本质 === 注解是继承自<code>java.lang.annotation.Annotation</code>的接口,其行为由JVM和编译器共同控制。 <mermaid> classDiagram class Annotation { <<interface>> +annotationType() Class<? extends Annotation> } class RetentionPolicy { <<enum>> SOURCE, CLASS, RUNTIME } class ElementType { <<enum>> TYPE, FIELD, METHOD,... } Annotation <|-- UserDefinedAnnotation RetentionPolicy --> UserDefinedAnnotation ElementType --> UserDefinedAnnotation </mermaid> === 元注解 === 定义注解行为的注解: * <code>@Retention</code>:指定生命周期(SOURCE/CLASS/RUNTIME)。 * <code>@Target</code>:指定作用目标(类/方法/字段等)。 * <code>@Documented</code>:是否包含在Javadoc中。 * <code>@Inherited</code>:是否允许子类继承。 <syntaxhighlight lang="java"> @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogExecutionTime { String value() default "defaultTask"; } </syntaxhighlight> == 注解应用 == === 自定义注解示例 === 以下是一个记录方法执行时间的注解实现: <syntaxhighlight lang="java"> public class PerformanceMonitor { public static void main(String[] args) throws Exception { MyService service = new MyService(); Method method = service.getClass().getMethod("doTask"); if (method.isAnnotationPresent(LogExecutionTime.class)) { long start = System.currentTimeMillis(); method.invoke(service); long end = System.currentTimeMillis(); System.out.println("Execution time: " + (end - start) + "ms"); } } } class MyService { @LogExecutionTime("task1") public void doTask() throws InterruptedException { Thread.sleep(1000); // 模拟耗时操作 } } </syntaxhighlight> '''输出''': <pre> Execution time: 1002ms </pre> === 框架中的应用 === * '''Spring''':<code>@Controller</code>、<code>@RequestMapping</code>通过反射解析路由。 * '''JUnit''':<code>@Test</code>标记测试方法。 * '''Hibernate''':<code>@Entity</code>定义数据库映射。 == 高级主题 == === 注解处理器 === 通过继承<code>AbstractProcessor</code>实现编译时处理: <syntaxhighlight lang="java"> @SupportedAnnotationTypes("com.example.LogExecutionTime") @SupportedSourceVersion(SourceVersion.RELEASE_8) public class LogProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) { // 生成代码或报告编译错误 return true; } } </syntaxhighlight> === 性能考虑 === * 运行时反射读取注解会有性能开销,高频调用场景需缓存结果。 * 编译时处理(如Lombok)无运行时开销。 == 常见问题 == === Q1:注解能继承吗?=== 默认不能,除非使用<code>@Inherited</code>元注解(仅对类生效)。 === Q2:注解可以嵌套吗?=== 可以,但需将注解类型作为成员变量: <syntaxhighlight lang="java"> public @interface NestedAnnotation { LogExecutionTime logConfig(); } </syntaxhighlight> == 总结 == 注解是Java中强大的元编程工具,广泛应用于框架开发、代码检查和配置管理。理解其原理和生命周期(SOURCE/CLASS/RUNTIME)是高效使用的关键。 [[Category:计算机科学]] [[Category:面试技巧]] [[Category:Java基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)