全文目录开篇语前言一、注解是什么注解的基本用法1. 基本语法二、注解的原理编译期、类加载期、运行时的作用1. 编译期注解不参与程序运行2. 类加载期注解可以用作元数据3. 运行时注解的核心应用三、注解的分类四、自定义注解实战我们来造一个“黑魔法”注解1. 定义一个自定义注解2. 使用自定义注解3. 创建注解处理器处理注解逻辑4. 测试5. 结果五、注解的高级应用Spring 和 Hibernate六、总结核心总结文末开篇语哈喽各位小伙伴们你们好呀我是喵手。运营社区C站/掘金/腾讯云/阿里云/华为云/51CTO欢迎大家常来逛逛今天我要给大家分享一些自己日常学习到的一些知识点并以文字的形式跟大家一起交流互相学习一个人虽可以走的更快但一群人可以走的更远。我是一名后端开发爱好者工作日常接触到最多的就是Java语言啦所以我都尽量抽业余时间把自己所学到所会的通过文章的形式进行输出希望以这种方式帮助到更多的初学者或者想入门的小伙伴们同时也能对自己的技术进行沉淀加以复盘查缺补漏。小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持前言在 Java 编程中注解Annotation这一概念虽然很常见但很多开发者在使用时可能只是停留在“用来做标记、配置”这一层面。你是不是也觉得注解就是加在类、方法、字段前面的一些小符号能够影响程序的行为但并没深究过它背后的原理和使用技巧其实注解在 Java 中扮演着非常重要的角色它不仅仅是“装饰器”更是编译期、类加载期甚至运行时的一种强大工具。今天我们不仅要了解注解的基本原理还将通过自定义注解的实战带你进入注解的“魔法世界”让你不再仅仅满足于“好用”而是深入理解注解背后的设计思想和应用场景。所以坐稳了接下来我们一起深入探索注解的奥秘搞定自定义注解这门“黑魔法”一、注解是什么注解从字面上来看它就是对代码的元数据注解。也就是说它不会直接影响程序的逻辑行为但能通过某些工具或框架读取并执行对应的功能。Java 中的注解并不是程序执行的一部分而是用来描述程序的结构、元信息甚至在特定的情况下改变程序的行为。注解的基本用法注解的定义非常简单语法结构类似于接口。常见的注解如Override、Deprecated、Entity等。它们一般不会影响程序的执行而是给编译器或者运行时提供一些额外的信息。// 使用 Override 注解表示该方法重写了父类的方法OverridepublicStringtoString(){returnHello, World!;}// 使用 Deprecated 注解表示该方法已过时不推荐使用DeprecatedpublicvoidoldMethod(){System.out.println(This method is outdated!);}1. 基本语法interfaceMyAnnotation{// 定义一个注解Stringvalue()defaultDefault;}简单来说注解就是用开头的特殊标记它可以附加在类、方法、字段、参数等位置。二、注解的原理编译期、类加载期、运行时的作用1. 编译期注解不参与程序运行注解可以在编译时用于检查比如Override它会帮助编译器检查我们是否真正重写了父类方法。如果我们用Override注解修饰的方法在父类中不存在编译器会报错。OverridepublicvoidsomeMethod(){// 编译期检查父类是否有该方法System.out.println(Hello);}2. 类加载期注解可以用作元数据注解还可以在类加载期间用于一些框架或工具类的处理比如 Spring 框架就是通过注解如Autowired来实现依赖注入的。3. 运行时注解的核心应用注解的最强大之处是在运行时它能通过反射机制被程序读取并执行。比如使用Entity注解标记的类ORM 框架如 Hibernate会在程序启动时通过反射读取注解信息进而将该类映射成数据库表。EntitypublicclassUser{IdprivateLongid;privateStringname;}三、注解的分类Java 中的注解有多种分类方式按照作用域和生命周期常见的分类方式如下标准注解Built-in AnnotationsOverride标识重写父类的方法。Deprecated标记该方法或类已经不推荐使用。SuppressWarnings抑制编译器警告。元注解Meta-AnnotationsRetention定义注解的生命周期。Target指定注解可以应用于哪些元素类、方法、字段等。Inherited使得注解可以从父类继承到子类。Documented使注解能够包含在 Javadoc 中。自定义注解Custom Annotations我们可以根据需要自定义注解下面将通过一个实际的案例来演示如何定义和使用自定义注解。四、自定义注解实战我们来造一个“黑魔法”注解1. 定义一个自定义注解我们先定义一个注解用于标记方法是否需要进行日志记录。// 定义注解Retention(RetentionPolicy.RUNTIME)// 注解在运行时有效Target(ElementType.METHOD)// 注解只能应用于方法上publicinterfaceLogExecutionTime{// 你可以在注解中定义元素作为附加信息}这里的Retention(RetentionPolicy.RUNTIME)表示注解会在运行时通过反射获取Target(ElementType.METHOD)表示注解只能用在方法上。2. 使用自定义注解接下来我们用这个注解来标记需要记录执行时间的方法publicclassMyService{LogExecutionTime// 标记需要记录执行时间publicvoidprocessData(){// 模拟一些耗时操作try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}3. 创建注解处理器处理注解逻辑接下来我们创建一个注解处理器通过反射扫描LogExecutionTime注解并记录方法的执行时间importjava.lang.annotation.Annotation;importjava.lang.reflect.Method;publicclassLogExecutionTimeProcessor{publicstaticvoidprocess(Objectobject)throwsException{// 获取对象的所有方法Method[]methodsobject.getClass().getMethods();for(Methodmethod:methods){// 检查方法上是否有 LogExecutionTime 注解if(method.isAnnotationPresent(LogExecutionTime.class)){longstartTimeSystem.currentTimeMillis();// 执行方法method.invoke(object);longendTimeSystem.currentTimeMillis();System.out.println(Execution time of method.getName(): (endTime-startTime) ms);}}}}4. 测试在main方法中我们创建MyService对象并使用注解处理器来记录方法执行时间publicclassMain{publicstaticvoidmain(String[]args)throwsException{MyServicemyServicenewMyService();LogExecutionTimeProcessor.process(myService);}}5. 结果程序运行后输出类似以下内容Execution time of processData: 1001 ms这就实现了通过自定义注解来记录方法的执行时间。注解的真正威力在于它能够让我们的代码更加简洁并且通过注解处理器灵活地控制行为。五、注解的高级应用Spring 和 Hibernate在框架中注解的使用已经达到极致尤其是 Spring 和 Hibernate 这样的框架它们几乎所有的功能都依赖于注解进行配置。比如Spring 注解Autowired、Component、Service、RequestMapping等Spring 容器通过这些注解来进行自动化装配和控制反转IoC。Hibernate 注解Entity、Id、Column等Hibernate 使用这些注解来映射 Java 类与数据库表之间的关系。这些框架的工作原理实际上都是通过扫描这些注解并通过反射获取相关信息最终动态生成代码执行操作。六、总结通过今天的讲解我们已经从注解的基础用法到自定义注解的实战应用都有了全面的了解。你会发现注解不仅仅是一个简单的标记它的设计原理和应用场景都充满了“魔力”它能够大大简化开发中的许多复杂任务。核心总结注解的作用通过元数据来描述程序的结构或提供额外的信息不直接影响程序的逻辑。自定义注解的优势通过反射机制能够在运行时灵活地处理业务逻辑提高程序的可扩展性和解耦性。高级应用注解在 Spring、Hibernate 等框架中得到广泛应用真正体现了注解在代码中的“黑魔法”力量。… …文末好啦以上就是我这期的全部内容如果有任何疑问欢迎下方留言哦咱们下期见。… …学习不分先后知识不分多少事无巨细当以虚心求教三人行必有我师焉wished for you successed ⭐️若喜欢我就请关注我叭。⭐️若对您有用就请点赞叭。⭐️若有疑问就请评论留言告诉我叭。版权声明本文由作者原创转载请注明出处谢谢支持