写在前面:各人好!我是晴空๓。如果博客中有不敷大概的错误的地方欢迎在批评区大概私信我指正,感谢各人的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢各人的支持。一起加油,冲鸭!
用知识改变命运,用知识成绩将来!加油 (ง •̀o•́)ง (ง •̀o•́)ง
媒介
框架 = 注解 + 反射 + 设计模式,要想看得懂框架以致自己写一个框架,那么久必然会涉及到注解。注解就是给代码添加一些信息,用字符 @ 开头,这些信息用于修饰紧挨着的其他代码元素(比如类、接口、字段、方法、方法中的参数、构造方法等)。当有了这些信息我们就可以在某些时候使用这些数据加强大概修改程序的行为。
常见的注解示例
生成文档相关的注解
当我们看 Java 的一些源码的时候会经常见到一些类、方法上面解释中的注解,我们在一样平常开辟的时候也可以将这些注解加到解释模板中以便我们的代码逻辑更加清晰明了。以下是常见的文档相关的注解:
注解含义@author标注开辟该类模块的作者@version该类模板的版本号@see相关的主题@since从哪个版本开始增加的该模块@param对方法中某个参数的阐明@return对方法返回值的阐明@exception对方法大概抛出的异常的阐明 JDK内置的三个基本注解
Java 5引入了第一批界说在 java.lang 中的三个通用注解,在看源码的时候也经常可以看得到。
注解含义@Override用于声明该方法的界说会重写基类中的某个方法@Deprecated用于表现所修饰的元素(类、方法)已过时@SuppressWarnings关闭不当的编译警告@SafeVarargsJava 7引入,用于在使用泛型作为可变参数的方法大概构造器中关闭对调用者的警告@FunctionalInterfaceJava 8 引入,用于表明范例声明是函数式接口 框架和库的注解
很多框架,比方 Spring、MyBatis等 都有属于框架自己的注解,这些注解一般用于简化配置,实现替代配置文件功能。同时也进步了程序的进步可读性和可维护性,大大进步了使用者的开辟服从。
注解的组成
元注解
元注解是为了对注解进行注解,Java 中有 5 中元注解。
@Target
用于标识该注解可以应用的地方。如果注解没有使用该元注解,该注解可以用于任何注解可以使用的地方(详见 ElementType 枚举)。使用 @Target 注解时,可以指定多个适用的元素范例,比方 @Target({ElementType.TYPE,ElementType.METHOD})。
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Target {
- /**
- * Returns an array of the kinds of elements an annotation type
- * can be applied to.
- * @return an array of the kinds of elements an annotation type
- * can be applied to
- */
- ElementType[] value();
- }
复制代码 ElementType枚举 具体参数如下:
ElementType含义TYPE类、接口、枚举或注解范例FIELD字段或枚举常量METHOD方法PARAMETER方法参数CONSTRUCTOR构造方法LOCAL_VARIABLE局部变量ANNOTATION_TYPE注解范例PACKAGE包TYPE_PARAMETER范例参数(JDK 1.8新增)TYPE_USE范例使用(JDK 1.8新增) @Retention
用于指定注解的保留计谋,即注解在代码的哪个阶段仍然有效。
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Retention {
- /**
- * Returns the retention policy.
- * @return the retention policy
- */
- RetentionPolicy value();
- }
复制代码 @Retention 注解的值是一个 RetentionPolicy 枚举范例,以下是三种常用的保留计谋:
RetentionPolicy含义SOURCE注解仅在源代码中存在,编译时会被抛弃。这意味着注解不会出现在编译后的 .class 文件中。通常用于编译器处理,比方生成代码或进行编译时检查。CLASS注解会被记录在 .class 文件中,但在运行时不会被虚拟机保留。这是默认的保留计谋。固然注解在 .class 文件中存在,但通过反射无法获取到这些注解。RUNTIME注解不光会被记录在 .class 文件中,还会在运行时被虚拟机保留。因此,可以通过反射机制在运行时读取这些注解的信息。
@Documented
用于指示注解是否应该被包含在 JavaDoc 文档中。当为一个注解范例加上 @Documented 注解时,这个注解范例及其使用情况会被 JavaDoc 工具记录在生成的文档中。
@Documented 注解自己不会改变注解的语义或行为,它只是影响 JavaDoc 的生成。如果不使用 @Documented 注解,注解范例及其使用情况默认不会被包含在 JavaDoc 文档中。
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Documented {
- }
复制代码 @Inherited
允许子类继承父类的注解,如果使用了 @Inherited 注解,子类将自动具有该注解。@Inherited 只对类注解有效,对方法或接口的注解没有影响。类实现接口时,不会继承接口上的注解,无论接口上的注解是否使用了 @Inherited。
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.ANNOTATION_TYPE)
- public @interface Inherited {
- }
复制代码 @Repeatable
Java 8 引入的元注解,用于声明一个注解范例可以被重复应用在同一元素上。要使用 @Repeatable,须要界说两个注解:一个是可重复使用的注解,另一个是容器注解。
界说可重复使用的注解
在注解界说中使用 @Repeatable 注解,并指定容器注解的范例。
- @Repeatable(Schedules.class)
- public @interface Schedule {
- String dayOfMonth() default "first";
- String dayOfWeek() default "Mon";
- int hour() default 12;
- }
复制代码 界说容器注解
容器注解必须有一个名为 value 的方法,返回一个可重复注解范例的数组。
- public @interface Schedules {
- Schedule[] value();
- }
复制代码 应用示例
- @Schedule(dayOfMonth="last")
- @Schedule(dayOfWeek="Wed", hour=24)
- public class MyClass {
- @Schedule(dayOfMonth="last")
- @Schedule(dayOfWeek="Fri", hour=23)
- public void doPeriodicCleanup() {
- // 方法实现
- }
- }
复制代码 在使用反射获取注解时,须要通过容器注解来获取全部重复的注解实例:
- Method method = MyClass.class.getMethod("doPeriodicCleanup");
- Schedules schedules = method.getAnnotation(Schedules.class);
- for (Schedule schedule : schedules.value()) {
- System.out.println(schedule);
- }
复制代码 小结
本篇主要写了注解的一些示例以及注解的组成,背面会继承写一下怎样自界说注解以及怎样使用注解。未完待续……
- 《ON JAVA 中文版-进阶卷》
- 《Java编程的逻辑》
- 尚硅谷
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |