从今天开始会开始写一个系列的博客,坚持做完一件事,同时也希望帮助到大家,吃透一门语言也是举一反三的基础,最近一直在焦虑自己年级原来越大在这行,该何去何从,最近豁然开朗,当真的走不下去的时候,开启一个新的工作方式和生活方式也是满开心的事情,但是在离开这个这一行,这岗位的时候或许应该留下来点什么,比如系列的博客
起源:
- Java 从1.5 开始引入了注解:他的概念和我们读书时候的标签一样,本身对程序任何作用,只是使用的人有意,便有了他的意思;比如标记书的页数,我们能够快速找到第几页;
成员:
1.元注解:注解之上的注解,是Java jdk 提供基础注解,方便我们自己去定义注解
- Java 的所有的元注解都实现了Anntation 接口
2 @Target: 用来标记自定义注解 ElementType.ANNOTATION_TYPE 可以应用于注解类型。 ElementType.CONSTRUCTOR 可以应用于构造函数。 ElementType.FIELD 可以应用于字段或属性。 ElementType.LOCAL_VARIABLE 可以应用于局部变量。 ElementType.METHOD 可以应用于方法级注解。 ElementType.PACKAGE 可以应用于包声明。 ElementType.PARAMETER 可以应用于方法的参数。 ElementType.TYPE 可以应用于类的任何元素。
3 @Retention:注解指定标记注解的存在方式 RetentionPolicy.SOURCE - 标记的注解仅保留在源级别中,并被编译器忽略。 RetentionPolicy.CLASS - 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略。 RetentionPolicy.RUNTIME - 标记的注解由 JVM 保留,因此运行时环境可以使用它。( 三个值的优先级 SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、 CLASS。)
- 另外还有@Documented 与 @Inherited 元注解,前者用于被javadoc工具提取成文档,后者表示允许子类 继承父类中定义的注解。
使用:
//@Target(ElementType.TYPE) 只能在类上标记该注解
@Target({ElementType.TYPE,ElementType.FIELD}) // 允许在类与类属性上标记该注解
@Retention(RetentionPolicy.SOURCE) //注解保留在源码中
public @interface Lance { }
赋值标记,用来标记信息,可在逻辑zhon
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Lance {
String value(); //无默认值 int age() default 1; //有默认值
}
@Lance("波") //如果只存在value元素需要传值的情况,则可以省略:元素名=
@Lance(value="波",age = 2)
int i;
注解APT注解处理器和和class 注解配合使用来帮助生成一些代码,方便开发者,比如阿里的Arouter,会利用apt 的Java 动态在编译时期生成辅助代码
APT全称为:"Anotation Processor Tools",意为注解处理器。顾名思义,其用于处理注解。编写好的Java源文 件,需要经过 javac 的编译,翻译为虚拟机能够加载解析的字节码Class文件。注解处理器是 javac 自带的一个工 具,用来在编译时期扫描处理注解信息。你可以为某些注解注册自己的注解处理器。 注册的注解处理器由 javac 调起,并将注解信息传递给注解处理器进行处理。