总结
1.如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。
2.注解的基本语法,创建如同接口,但是多了个 @ 符号。
3.注解的元注解。
4.注解的属性。
5.注解主要给编译器及工具类型的软件用的。
6.注解的提取需要借助于 Java 的反射技术,反射比较慢,所以注解使用时也需要谨慎计较时间成本。
注解和XML的区别
1.以前通过给开发者提供xml文件,编译器和框架最后读到这个xml后,可以拿到所有标签数据,并且存到数据结构中去
框架通过读取 这个数据结构的标签属性,拿到标签的所有内容(包括标签的属性和标签包含的内容),去做对应的功能
2.注解也要完成同样的功能
1.框架 能够读到这个注解,并且能够拿到注解修饰的内容,从而框架能够通过注解,以及注解修饰的内容去完成相应的功能
2.如何拿到注解:通过反射机制,拿到 类的 class对象即可
注解修饰注解:可以看作标签中有子标签,父标签不仅有自己的功能,也有子标签的功能,本来注解也就是由元注解,一层一层封装,来拥有各种各样的功能的,而不是一个注解代表一个功能,如果一个注解想要有另一个注解的功能并且也想有自己独一无二的功能,那么这个注解被那个注解修饰即可了,然后在通过反射机制Test.class.isAnnotationPresent拿到这个注解,然后通过再一次isAnnotationPresent拿到另外一个注解,完成另一个注解的功能
元注解(最基础的注解,所有的注解都是由他们修饰而来)
1.元标签有 @Retention、@documented、@Target、@Inherited、@Repeatable 5 种。
2.@Retention:解释说明了这个注解的的存活时间。
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
3.@Target:注解的作用域
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
注解的提取(如何获取到注解及其修饰的类对象属性方法)
1.通过 反射,获得 类的 class对象
2.首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解
3.然后通过 getAnnotation() 方法来获取 Annotation 对象。
4.如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了,并且可以用注解修饰的 地方 来完成具体功能了
注解的使用场景(重点,编译期和运行期都可以处理注解)
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
值得注意的是,注解不是代码本身的一部分。
获取注解的方式是反射,至于框架什么时候获取注解,并且处理注解,并且注解的具体作用是什么,这个是框架自己设定的,注解本身是没有任何含义的,有的作用都是框架认得这个注解,例如它内部自己设定,component注解修饰的类,就可以用它来new 对象