java的注解类型(Annotation)
⼀,前⾔
注解,在java程序中经常看到的@Override、@Deprecated,在SpringBoot中经常⽤到的@XX。
注释:书写在代码中⽤以辅助 ⼈ 理解代码的⽂字,不参与程序的运⾏,对代码没有任何影响。
注解:①代码中的特殊标记,以“@注释名”的形式存在于代码中,⽤以辅助程序的理解代码代码,②程序可以读取注解,对被标注的程序(类、⽅法、属性等)进⾏限制、规定如何运⾏等,③也是⼀种类的类型(⾃⼰的理解,不⼀定完整准确)。
注解在java中的典型应⽤:通过反射技术获取被注解的代码⾥的注解,以决定如何运⾏这段代码,即通过反射机制访问代码。
⼆,⾃定义注解
注解也是⼀种类的类型,开发⼈员可以⾃⾏定义并使⽤注解。
创建⽂件时选择Annotation。
以上代码就是⼀个⾃定义的注解
注解类使⽤@interface关键字进⾏修饰
注解中只能包含属性
属性后需要加 ()
可以通过使⽤default关键字为属性赋予默认值
三,注解的本质
对注解的class⽂件进⾏反编译:
可以看出:
注解本⾝就是接⼝(interface)
注解天⽣继承了java.lang.annotation.Annotation类
注解中的属性变成了接⼝中的抽象⽅法
总之,注解本质就是接⼝
四,注解属性的类型
注解中的属性可以是什么类型的?
从错误提⽰“only primitive type,String ,Class,annotation,enumeration are permitted or 1-dimensional arrays thereof",注解的属性只能是:
基本数据类型
String
Class类型
枚举类型
注解类型
以及上⾯类型中的⼀位数组
五,使⽤⾃定义注解及通过反射获取注解信息
⾃定义⼀个注解——>在类中使⽤——>main函数测试,所以⼀共需要三个⽂件
⾃定义⼀个注解:
在类中使⽤:
main函数测试:
但是,此时程序不能运⾏⾄正确结果:
此时,在⾃定义的注解中加⼊@Retention(RetentionPolicy.RUNTIME)即可:
java技术介绍百度百科
这⾥⽤到了元注解,将在下⽂展⽰。
六,元注解
元注解,⽤来描述注解的注解,负责注解其他的注解,即对注解的代码进⾏限制、规定如何运⾏。
元注解有:@Retention、 @Target、 @Document、 @Inherited(这四个在jDK1.5引⼊)和@Repeatable(JDK1.8加⼊)五种
①@Retention
单词本⾝的意思是保留,该注解⽤于指定被注解的注解可以保留的域!有三个取值:
RetentionPolicy.SOURCE:编译时直接丢弃被该注解标注的注解,只在源代码⽂件中保留;
RetentionPolicy.CLASS:被该注解标注的注解会被记录在class⽂件中,运⾏java程序时JVM不保留;默认值!
RententionPolicy.RUNTIME:被该注解标注的注解会被记录在class⽂件中,运⾏java程序时,JVM会保留被该注解标注的注解,程序可通过反射获取被该注解标注的注解。
所以,新创建的注解的保留域默认是@Retention(RententionPolicy.CLASS),被标注的注解会在程序运⾏时丢失,,所以此时通过反射获取注解时,程序不能到注解,所以出现指针为空!——修改保留域@Retention(RententionPolicy.RUNTIME)即可。
②@Target
指定被@Target修饰的注解能⽤于修饰哪些程序单元,即指定标注的注解可以修饰的程序类型。
以上代码,通过@Target(ElementType.METHOD)修饰⾃定义的注解TestAnnotation,则该注解将只能修饰⽅法,否则就会报错:
从源码中可以看出,@Target这条注解中只有⼀个类型是ElementType的数组的属性,其中程序规定了ElementType的可选参数。
也就是说,@Target()在修饰注解时,可以传递固定的⼏种参数:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论