🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- JavaSE核心知识点03高级特性03-05(注解)
- 一、注解是什么?
- 类比理解:
- 二、Java 内置的常用注解
- 1. `@Override`
- 2. `@Deprecated`
- 3. `@SuppressWarnings`
- 三、如何自定义注解?
- 1. 定义注解
- 2. 元注解(Meta-Annotation)
- 四、注解的处理方式
- 1. 反射处理(运行时)
- 2. 编译时处理(如 Lombok)
- 五、实际应用场景
- 六、注意事项
- 七、总结
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
JavaSE核心知识点03高级特性03-05(注解)
好的!我来为你详细讲解 Java 中的注解(Annotation),内容会循序渐进,尽量通俗易懂。以下是完整的学习路径:
一、注解是什么?
注解(Annotation)是 Java 中的一种元数据(描述数据的数据),它本身不直接影响代码逻辑,但可以为代码提供额外的信息。类似于“标签”,用来标记代码的特殊行为或配置。
类比理解:
- 想象你在一本书上贴便利贴,便利贴本身不改变书的内容,但能提醒你注意某些部分(如“重点”、“待办”)。注解的作用类似。
二、Java 内置的常用注解
Java 提供了一些内置注解,以下是几个常见的:
1. @Override
- 作用:标记方法是为了覆盖父类或接口中的方法。
- 示例:
@Override public String toString() {return "This is a custom toString()"; }
- 用途:帮助编译器检查是否正确覆盖了父类方法(避免拼写错误)。
2. @Deprecated
- 作用:标记方法、类或字段已过时,不推荐使用。
- 示例:
@Deprecated public void oldMethod() {// 过时的方法 }
- 效果:调用该方法时,编译器会生成警告。
3. @SuppressWarnings
- 作用:抑制编译器警告。
- 示例:
@SuppressWarnings("unchecked") public void someMethod() {List list = new ArrayList(); // 这里会有“未检查类型”的警告,但被注解抑制 }
三、如何自定义注解?
你可以创建自己的注解,以下是步骤:
1. 定义注解
使用 @interface
关键字:
// 定义一个名为 MyAnnotation 的注解
public @interface MyAnnotation {String value() default ""; // 注解的参数int priority() default 0;
}
2. 元注解(Meta-Annotation)
元注解是用于修饰注解的注解,用来定义注解的行为:
元注解 | 作用 |
---|---|
@Target | 指定注解可以应用的位置(如类、方法、字段等)。 |
@Retention | 指定注解的保留策略(源码级、编译期、运行时)。 |
@Documented | 注解会被包含在 Javadoc 中。 |
@Inherited | 子类可以继承父类的注解。 |
示例:定义一个用于方法的运行时注解
import java.lang.annotation.*;@Target(ElementType.METHOD) // 只能用在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时保留
public @interface MyMethodAnnotation {String description() default "默认描述";boolean enabled() default true;
}
四、注解的处理方式
注解本身没有行为,需要通过反射或编译时处理来触发逻辑。
1. 反射处理(运行时)
通过反射读取注解信息:
public class Test {@MyMethodAnnotation(description = "这是一个测试方法")public void testMethod() {// 方法内容}public static void main(String[] args) throws NoSuchMethodException {Method method = Test.class.getMethod("testMethod");if (method.isAnnotationPresent(MyMethodAnnotation.class)) {MyMethodAnnotation annotation = method.getAnnotation(MyMethodAnnotation.class);System.out.println("描述:" + annotation.description()); // 输出:这是一个测试方法System.out.println("是否启用:" + annotation.enabled()); // 输出:true}}
}
2. 编译时处理(如 Lombok)
通过注解处理器(Annotation Processing Tool, APT)在编译时生成代码。例如 Lombok 的 @Data
注解会自动生成 getter/setter。
五、实际应用场景
-
框架配置(如 Spring):
@Service public class UserService {@Autowiredprivate UserRepository userRepository; }
-
单元测试(如 JUnit):
@Test public void testAddition() {assertEquals(4, 2 + 2); }
-
序列化/反序列化(如 Jackson):
public class User {@JsonProperty("user_name")private String userName; }
六、注意事项
- 保留策略:如果需要在运行时获取注解,必须设置
@Retention(RetentionPolicy.RUNTIME)
。 - 目标范围:用
@Target
明确注解的应用位置(如ElementType.TYPE
表示类)。 - 默认值:注解参数需定义默认值(如
default ""
),否则使用时必须显式赋值。 - 参数类型限制:注解的参数只能是基本类型、String、Class、枚举或数组。
七、总结
- 注解的作用:提供元数据,辅助代码分析或配置。
- 核心步骤:定义注解 → 用元注解修饰 → 处理注解逻辑(反射/APT)。
- 学习建议:从简单注解开始,尝试结合反射实现功能(如自定义日志注解)。
动手练习:
- 定义一个注解
@LogExecutionTime
,用于记录方法的执行时间。 - 通过反射在方法执行前后计算时间差。
如果有疑问,可以随时提出!
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇