大家好,又见面了,我是你们的朋友全栈君。
一、注解的概念:
注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解!
Java注解(Annotation)也叫做元数据,以
@注解名
在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。
1.1 Java注解按照含有参数的个数分为三种:
- 不带参数,语法结构为:@Annotation,例如@FunctionalInterface;
- 带一个参数的注解,语法结构为:@Annotation(参数);
- 带多个参数的注解,语法结构为:@Annotation(参数1,参数2,参数3…)。
1.2 内置注解
@Override
被用于标注方法,用于说明所标注的方法是重写父类的方法;@Deprecated
用于说明所标注元素(成员变量或方法)因存在安全问题或有更好选择而不鼓励使用,如果强制使用,则编译器会发出警告:
@SuppressWarnings
用于取消编译器所显示的警告:
二、自定义注解
2.1 注解的语法结构:
[public] @interface 注解名{
[属性1;]
[属性2;]
...
[属性n;]
}
2.2 属性的语法结构:
数据类型 属性名() [default 默认属性值];
2.3 示例:
public @interface Autowried {
String value() default "";
}
注意:
-
如果注解属性没有默认值,则使用该注解时必须指定值(否则会报错):
如果注解属性有默认值,则使用时@Autowried()
和@Autowried
都对。 -
如果注解属性名为
value
,且只有它一个属性时,使用该注解可以直接赋值,即@Autowried("")
等价于@Autowried(value = "")
-
如果注解属性的数据类型为数组类型,赋多个值时必须使用
{}
括起来;但若只赋一个值时,则无需使用{}
。
三、元注解
元注解是Java语言中用于修饰自定义注解的注解,常用的元注解有:
@Target
,@Retention
,@Documented
,@Inherited
和@Repeatable
,其中@Repeatable
是JDK8.0新添加的元注解。
3.1 @Target
:用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元素有如下属性值:
ElementType.ANNOTATION_TYPE
:应用于其他注解的元注解;ElementType.CONSTRUCTOR
:应用于构造函数;ElementType.FIELD
:应用于全局属性;ElementType.LOCAL_VARIABLE
:应用于方法中的本地变量;ElementType.METHOD
:应用于方法;ElementType.PACKAGE
:应用于包;ElementType.PARAMETER
:应用于方法的参数;ElementType.TYPE
:应用于类、接口或者枚举声明。
示例:
?上面的自定义注解@Autowried
没有被任何元注解修饰,所以它可以在任何地方被使用,不受任何限制。
? 我们可以看到:当给自定义注解@Autowried
添加元注解@Target(ElementType.FIELD)
(仅用于修饰全局属性)时,只有在修饰全局属性时是可以用的,用在其他地方都会报错!
3.2 @Retention
:用于指定被修饰的自定义注解可以保留多久,该元注解有如下属性值:
RetentionPolicy.SOURCE
:编译器将直接丢弃被修饰的注解(也就是说编译器将源码编译成class文件时直接丢弃,自定义注解不会出现在class文件中);RetentionPolicy.CLASS
:默认值,编译器将把注解记录在class文件中,但是当运行Java程序时,虚拟机不再保留自定义注解(也就是说源码和class文件中有自定义注解,但Java程序运行时没有);RetentionPolicy.RUNTIME
:编译器将把注解记录在class文件中,当运行Java程序时,虚拟机保留注解,程序可以通过反射获取该注解;
示例:
? 当自定义注解被@Retention(RetentionPolicy.CLASS)
修饰时,自定义注解只存在于源码和class文件中,所以运行时获取不到,为null。
? 当自定义注解被@Retention(RetentionPolicy.RUNTIME)
修饰时,自定义注解可以保存在Java虚拟机中,所以运行时也存在,即可以获取到:@com.jd.Autowried("")
3.3 @Documented
(不常用):执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中。
3.4 @Inherited
(不常用):如果父类所使用的注解被@Inherited
修饰,则子类可以继承该注解,(否则不能继承)。
3.5 @Repeatable
(不常用):所修饰的自定义注解可以重复在同一个类、方法或变量上使用。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/156518.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...