JDK内置注解
@Override 注解
- 限定重写父类方法,该注解只能用于方法
父类:
public class Person {
public void eat(){
System.out.println("父类eat");
}
}
子类:
public class Student extends Person {
/*
@Override作用:限定重写的方法,只要重写方法有问题,就有错误提示
*/
public void eat(){
System.out.println("子类eat");
}
}
Deprecated 注解
- 用于表示所修饰的元素(类、方法、构造器、属性等)
已过时
。通常是因为所修饰的结构危险或存在更好的选择/*
在方法前加入 @Deprecated,这个方法就会变成一个废弃方法/过期方法/过时方法
*/
@Deprecated
public void study(){
System.out.println("学习");
}
}
public class Test {
public static void main(String[] args) {
new Student().study();
}
}
@Suppresswarnings 注解
- 抑制编译器警告
```java
public class Test {
public static void main(String[] args) {
@SuppressWarnings("unused")//未被使用警告
int num = 10;
@SuppressWarnings({"unused","rwatypes"})//未被使用警告,范型警告
ArrayList a = new ArrayList();
}
}
<a name="pm3Hf"></a>
## 自定义注解
> - 自定义注解使用很少,一般情况下都是使用现成的注解
�注解的声明很像接口的声明,只比接口多了一个@符号(@interface)。下面就是一个最简单的注解:
```java
public @interface Test {
}
这个注解没有任何的注解元素,不包含任何元素的注解称为
标记
注解,反之称为元数据
注解元素
上面的Test
是一个注解,但是它并没有什么作用。当我们需要注解提供一些信息时,就需要为注解提供一些注解元素了。注解元素是什么呢?看下面这个例子:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Student {
int id();
String name() default "嘿嘿";
}
id
和name
就是两个注解元素
,name
通过default
声明了自己的默认值
,如果在注解某个方法的时候,没有给出name的值,就会使用默认值。
这两个元素其实都是字段,但是是以方法的形式声明的,为什么要以方法的形式声明而不是直接声明字段呢?因为反编译后的Student就是一个继承了Annotation
的接口。接口中是不能有成员变量的,所以注解提供了这种特殊的声明字段的方式来给出注解元素。
注解元素的限制
注解元素的类型是有限制的,可以作为注解元素的类型有:
- 基本数据类型
- String类型
- class类型
- 枚举类型
- 注解类型
- 所有以上类型的数组
默认值限制
注解元素除了类型有限制外,默认值也有限制。首先,每个注解元素要么有默认值,也就是在定义注解时通过default
给定,要么就在使用注解时给定。如果两者都没有,就会出现编译错误。
此外,任何非基本类型的注解元素,无论是在注解声明时给定的默认值,还是在使用注解时给定的值,都不能是null。看下面这个示例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Student {
int id();
String name() default "嘿嘿";
}
StudentTest方法在使用注解时给定name为null,编译器给出了错误信息。
使用注解
(1)定义了元素,就必须给元素进行赋值
@MyAnnotation(value = {"abc","he","xi"})
public class Person {
}
(2) 如果只有一个元素,并且这个元素名字为value的话,那么value =
可以省略不写
@MyAnnotation({"abc","he","xi"})
public class Person {
}
(3) 如果元素设置默认值,那么使用就无需传值
public @interface MyAnnotation2 {
String value() default "abc";
}
@MyAnnotation2
public class Person {
}
(4) 一个注解的内部是可以不定义元素
public @interface MyAnnotation3 {
}
元注解
- 用来修饰其他注解的注解
@Target
表示该注解用于什么地方,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR
:构造器声明ElemenetType.**FIELD**
:字段声明(包括 enum 实例)ElemenetType.LOCAL_VARIABLE
:局部变量声明ElemenetType.**METHOD**
:方法声明ElemenetType.PACKAGE
:包声明ElemenetType.PARAMETER
:参数声明ElemenetType.**TYPE**
:类、接口(包括注解类型)、enum@Retention
表示注解信息
**保存时长**
。可选的RetentionPolicy 参数包括:RetentionPolicy.SOURCE
:注解将被编译器丢弃RetentionPolicy.CLASS
:注解在**class**
文件中可用,但会被**VM**
丢弃RetentionPolicy.**RUNTIME**
: VM将在运行期也保留注释,因此可以通过**反射机制读取注解的信息**
。@Documented
将此注解包含在**javadoc**
中 ,它代表着此注解会被**javadoc**
工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited
允许子类继承父类中的注解。
@Repeatable
允许一个注解可以被使用一次或者多次