目录
注解是什么
注解的种类
标准注解
元注解
注解是什么
注解又叫元数据,像写给程序看的一种标签一样的提示,用于对代码进行说明和对使用了注解的程序提供判断依据;
补充:
1:注解也称为元数据,用于修饰解释包,类,方法,属性,构造方法,局部变量等数据信息。
2:和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入代码中的补充信息;
3:在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等,在JavaEE中占据了更重要的角色。例如用来配置应用程序的任何切面等;
使用方法:@ + 注解,放在想要修饰的程序元素前面;
注解的种类
1:标准注解,此注解是Java自带的注解,有它们特定的注解用处,如@Override,@Deprecated,@SuppressWarnings等;
2:元注解:用来修饰注解的注解,如@Target,@Documented等;
3:自定义注解:程序员自己按照需求定义的注解。
标准注解
定义:标准注解是Java已经规定好并直接提供给程序员使用的注解,有它们特定的用处。下面介绍常用的注解。
* @Override注解
作用:该注解用于标记子类的方法为父类方法的重写方法,如下:
class Person{
public void run(){
System.out.println("这个人在奔跑。。。");
}
}
class Student extends Person{
@Override //使用@Override注解标记重写的方法
public void run() {
System.out.println("这个学生在奔跑。。。");
}
}
说明:1:该方法写在子类重写的方法之前,表明该子类方法重写了父类的方法;
2:该注解只能修饰方法。
补充:如果这里没有写该注解,子类仍然重写了父类的方法;
区别在于:如果写了该注解,编译器就会在该类的父类中检查是否有和此方法重名的方法,如果有,代表子类的确重写了父类的方法,编译就会通过。反之编译就会报错。
* @Deprecated注解
作用:该注解用来表示某个程序元素已过时,如下:
public class Annotation {
public static void main(String[] args) {
//使用@Deprecated标记的类时,
//该类会用线划掉来表示该类已过时。
Student student = new Student();
}
}
class Person{
public void run(){
System.out.println("这个人在奔跑。。。");
}
}
@Deprecated //使用@Deprecated注解标记Student类
class Student extends Person{
@Override //使用@Override注解标记重写的方法
public void run() {
System.out.println("这个学生在奔跑。。。");
}
}
说明:1:该注解写在程序元素的前面,代表该注解已过时;
2:该注解可以修饰很多的程序元素,包括类,方法,字段等。
补充:已过时的方法还可以使用,只是不推荐使用,它的作用主要是进行版本的兼容和过渡;比如在实际的开发中,老版本往往含有很多冗余过时的功能和代码,但新版本完全删除这些代码可能会影响性能,此时就可以添加@Deprecated注解来进行过渡。
* @SuppressWarnings注解
作用:该注解可以抑制可能出现的警告(使该警告不在出现)。如下:
@SuppressWarnings({"all"}) //抑制所有警告
public class Annotation {
public static void main(String[] args) {
//警告1:student变量从未使用
Student student = new Student();
}
}
@SuppressWarnings({"all"}) //抑制所有警告
class Person{
//警告2:run方法从未使用
public void run(){
System.out.println("这个人在奔跑。。。");
}
}
class Student extends Person{
public void run() {
System.out.println("这个学生在奔跑。。。");
}
}
说明:1:使用 "all" 标识可以抑制所有警告;
2:可以修饰类,方法等程序元素;
3:该注解有作用域,放在类或方法前面,就只能抑制类或方法当中的警告;
补充:格式:@SuppressWarnings({" n "})
n为想要抑制的警告类型,n有如下选项:
| 关键字 | 抑制警告类型 |
| all | 抑制所有警告 |
| boxing | 抑制与封装,拆装等包装类警告 |
| cast | 抑制与强制类型转换相关的警告 |
| dep-ann | 抑制与淘汰注释相关的警告 |
| dprecation | 抑制与淘汰的相关警告 |
| fallthrough | 抑制与switch陈述式中遗漏break相关的警告 |
| finally | 抑制与未传回finally区块相关的警告 |
| hiding | 抑制与隐藏变数的区域变数相关的警告 |
| incomplete-switch | 抑制与switch陈述式(enum case)中遗漏项目相关的警告 |
| javadoc | 抑制与javadoc相关的警告 |
| nls | 抑制与nls字串文字相关的警告 |
| null | 抑制与空值分析相关的警告 |
| rawtypes | 抑制与使用raw类型相关的警告 |
| resource | 抑制与使用Closeable类型的资源相关的警告 |
| restriction | 抑制与使用不建议或禁止参照相关的警告 |
| serial | 抑制可序列化的类别遗漏serialVersionUID栏位相关的警告 |
| static-access | 抑制与静态存取不正确相关的警告 |
| static-method | 抑制与静态方法相关的警告 |
| super | 抑制与置换方法相关但不含super呼叫的警告 |
| synthetic-access | 抑制与内部类别的存取未最佳化相关的警告 |
| sync-override | 抑制因为置换同步方法而遗漏同步化相关的警告 |
| unchecked | 抑制与未检查的作业相关的警告 |
| unqualified-field-access | 抑制与栏位存取不合格相关的警告 |
| unused | 抑制与未用的程式码即停用的程式码相关的警告 |
元注解
定义:修饰注解的注解;
* Retention注解
作用:只能用于修饰一个注解的定义,用于指定该注解可以保留多长时间,该注解包含一个RetentionPolicy类型的成员变量,使用该注解时必须为该value变量指定值;如下:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE) //指定该注解只能在编译时使用
public @interface SuppressWarnings {
String[] value();
}
说明:1:以上是@SuppressWarnings注解的源代码;
2:@Retention注解中RetentionPolicy的值SOURCE指定了@SuppressWarnings的作用范 围只在编译器编译时,使用后直接丢弃。
补充:该注解的三种值:
1:RetentionPolicy.SOURCE:编译器使用后,直接丢弃这种策略的注释;
2:RetentionPolicy.CLASS:编译器把注解记录在class文件中,当运行Java程序时,JVM不会保留注解,这是默认值;
3:RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行Java程序时,JVM会保留该注解,程序可以获取该注解;
还有补充(想不到吧):Java文件编译运行的过程:
1:Java文件先通过编译器(Javac)编译为class文件。如果在该元注解里写上SOURCE,则此注解只在这一阶段保留;
2:class文件被加载到JVM中进行加载;如果在该元注解里写上CLASS,此注解可以保留到这个阶段;
3:JVM运行程序;如果在该元注解里写上RUNTIME,此注解可以一直被保留到运行时。
* @Target注解
作用:用于修饰注解的定义,用于指定被修饰的注解能用于修饰那些程序元素。@Target也包含一个名为Value的成员变量;如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) //该元注解指定了此注解只能修饰方法
public @interface Override {
}
说明:1:以上为@Override的源码;
2:@Target指定了该注解只能修饰方法。
@Documented
@Retention(RetentionPolicy.RUNTIME)
//该元注解指定了此注解可修饰的范围
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
String since() default "";
boolean forRemoval() default false;
}
说明:1:以上是@Deprecated的源码;
2:该元注解指定了该注解可以修饰类,方法,字段等程序元素。
补充:使用格式@Target(value={n})
n为可以指定的修饰范围,n有如下选项
| n的值 | 指定的范围 |
| CONSTRUCTOR | 构造方法 |
| FIELD | 字段 |
| LOCAL_VARIABLE | 局部变量 |
| METHOD | 方法 |
| PACKAGE | 软件包 |
| PARAMETER | 构造方法变量 |
| TYPE | 类 |
n可以写多个变量,不同的变量之间用" , "隔开。
* @Documented注解
作用:该注解用于指定被该元注解修饰的注解类将被Javadoc提取成文档,即在生成文档时,可以看到该注解。如上面@Deprecated注解的源码;
补充:定义为Dcumented的@Retention注解必须设置成RUNTIME(运行时)。(如上)
* @Inherited注解
作用:被该注解修饰的注解将具有继承性。如果某个类使用了被该注解修饰的注解,那么它的子类会自动具有该注解。
补充:该注解只能用于对类的注解,该注解不能用于实现接口的类。



