一、Annotation
Annotation不是程序本身,但它可以对程序进行解释,这一点和注释类似。
但最大的不同点在于,注解可以被其他程序读取,然后可以对其进行一些有针对性操作。
这是注解与注释最大的不同之处。
注解可以使用在package(包),class(类),method(方法),filed(属性)等上面。
二、内置注解
1.@Override
指明修饰的方法是被重写的方法,如果被@Override修饰的方法不是被重写的方法,编译器会报错。
2.@Deprecated
Derprecated英文意思是废除,不赞成的意思。该注释的含义是,不赞同使用该注释修饰的内容。
使用了@Deprecated修饰的内容编译器会发出一个警告,但只是警告要是实在要用也是可以用的,
只是不赞成使用,不代表不能使用。
3.@SuppressWarnings
该注解的作用是抑制警告,例如在程序中有一些不规范的写法会产生警告,但在这些写法并不会影响运行。
如果此时我们不想看见编译器提示的警告信息,这时就可以通过@SuppressWarnings来抑制警告。
我们可以看到使用@SuppressWarnings时,后面加了个括号,里面写了个all。
我们看下@SuppressWarnings的定义:
其中有一个value(),注意这个不是方法,它@SuppressWarnings的属性。
属性类型是字符串数组,每次传递参数的时候就可以(value={“str1”,“str2“,“str3”......})
使用时就通过这样来使用,@SuppressWarnings(value={"all"}),
由于@suppressWarnings只有value一个属性,可以直接写成(“all”)。
这里的all不是随便传入的,对应的参数有其对应的含义。
参数 | 说明 |
deprecation | 使用了某些不赞成使用的类和方法 |
unchecked | 未检查的转换 |
unused | 未使用的变量 |
resource | 有泛型未指定类型 |
all | 所有警告 |
例如这里@SuppressWarnings(value = {“unused”,“deprecation”}),这样写就代表压制未使用变量异常和使用了不赞成使用的类和方法异常。
这里只举出一些例子,还有很多参数大家可以在网上查阅。
三、自定义注解
上面都是使用的内置注解,当然我们也可以自定义注解。
我首先来看下注解的格式,以@SuppressWarnings为例。
我们可以看到注解开头有两个注解@Target、@Retention这两个注解称为元注解,用于对注解进行注解。
(还有其他两个元注解此处就不介绍了,想了解可以自行查阅。)
@Target用于描述注解的使用范围,如果使用注解的范围,不在注解定义的范围中则会报错。
例如注解定义的范围是TYPE可以用于Class Interface中,如果将其使用在方法前面则会报错。
要将其使用在方法前需要加上METHOD,由于@Target的值时String[] 类型,故可以添加多个参数(范围)。
参数及其范围:
@Retention表示该注解机制的保留级别,及存在周期。
取值RetentionPolicy.xxxx
SOURCE:在源文件中有效,即源文件中保留。
CLASS:在class文件中有效,即class文件保留。
RUNTIME:在运行时有效,为RUNTIME时可以被反射机制读取。
有了上面的预备知识后我们就可以自定义注解了。
我们可以在新建中直接创建一个新的注解。
这个自定义的注解作用范围是TYPE,保存级别是RUNTIME。其中还有一些属性及其默认值。
注意:注解中属性用xxx()表示,赋值时是注解名(xxx=......).
这样我们就定义好了一个注解,default是设置的默认值,如果使用注解时没有指定值就使用默认值。
当然也可以不设置默认值,但是不设置默认值的话,使用注解时必须对其属性赋值,不对其进行赋值的话会报错。
但如果是设置了默认值,不对其赋值会自动使用默认值不会报错。
使用时我们可以对其重新赋值,也可以不对其赋值让它使用默认值。
但是如果没有设置默认值,则必须在使用时对注解中属性赋值不然会报错。
单纯的定义注解没有任何意义,必须配合对注解进行处理的程序才有意义。
详见反射:https://www.cnblogs.com/huang-changfan/p/10055286.html。