注解
一、注解介绍
注解是JDK1.5之后,Java增加了对元数据(metadata)的支持,也就是注解(Annotation),其实就是代码里面的特殊标记,这些标记可以在程序编译、加载、运行的时候被读取,并且执行相应的处理,通过使用Annotation注解,程序员可以在不改变原有程序逻辑的情况下,在原程序中嵌入一些补充信息,Annotation可以像修饰符一样被使用,可以由于修饰类、包、接口、方法、构造方法、全局变量、参数、局部变量等等,这些信息被保存在Annotation的name=value对中。对于我们目前来说,我对自定义注解的要求不高,但是我们重点是要学习后面JDK,JavaEE,Spring,SpringMVC,MyBatis,SpringBoot,SpringCloud中提供的注解的用法。在涉及到框架开发的话,几乎都使用注解的方式。
二、JDK提供的三个注解
使用Annotation时要在其前面加上@符号,并把该Annotation当成一个修饰符来使用,用于修饰它支持的程序的元素。JDK提供的三个基本的注解:
- @Override : 限定方法为复写父类的方法,或者是实现接口的方法
- @Deprecated:限定类或者方法已经过时了
- @SuppressWarnings:拟制编译器警告,如果程序中有警告,又不希望警告出现,可以使用这个注解进行抑制。
注解1:@Override
package com.wanbangee.annotationdemo;
public class SalerEmployee extends Employee{
private double lastSale;
//...省略属性和构造器 还有 getter和setter方法
/**
* @Override 表示子类复写的父类的方法,或者实现类实现的接口的方法
* 如果子类复写的方法上不加上@Override 注解
*/
@Override
public void sayHello() {
System.out.println("复写了父类的方法");
}
public void sayGoodBye() {
}
@Override
public void walk() {
}
}
注解二:@Deprecated注解,可以注解在类声明处和方法声明处,表示此类或者此方法已经过时
package com.wanbangee.annotationdemo;
public class TestDeprecated {
public static void main(String[] args) {
Person person = new Person();
person.age = 20;
person.name = "紫霞仙子";
person.printPerson();
}
}
@Deprecated
class Person{
int age;
String name;
@Deprecated
public void printPerson() {
System.out.println(this.name + "====" + this.age);
}
}
注解3:@SuppressWarnings,抑制编译器警告
package com.wanbangee.annotationdemo;
import java.util.ArrayList;
import java.util.List;
public class ListDemo01 {
//抑制编译器警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
List list = new ArrayList();
list.add("白骨精");
list.add("蜘蛛精");
list.add("老鼠精");
}
}
三、自定义注解类型
在开发中很少去使用,如果是编写自己的框架时,会使用的。
- 定义新的注解需要使用@interface关键字声明
- Annotation的成员变量在Annotation定义中以无参数方法的形式来申明
- 可以给声明的成员变量指定初始值,指定初始值使用default关键字
- 没有成员定义的Annotation称为标记,包含成员变量的Annotation称为元数据的Annotation
package com.wanbangee.annotationdemo;
/**
* 自定义注解
* @author Administrator
*
*/
public @interface MyAnnotation {
}
四、元注解
所谓元注解,就是给自定义注解上面标注的注解。在JDK1.5之后专门提供了在注解上面进行注解的注解类型,分别是:
- @Retention :只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长的时间,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention注解时候必须为改成员变量指定值:
- RetentionPolicy.SOURCE:表示编译器直接丢弃这种策略的注解
- RetentionPolicy.CLASS:编译器会将这种注解策略记录在class文件中,当运行java程序的时候,JVM不会保留这个注解,这是默认值
- RetentionPolicy.RUNTIME:在程序编译、运行的各个环境,都会保留这种注解,程序可以通过反射获得该注解。
- @Target : 用于定义注解可以标注的位置
- TYPE:表示可以标注在类上
- FIELD:表示标注在属性上
- METHOD:表示可以标注在方法上
- PARAMETER : 表示可以标注在参数上
- CONSTRUCTOR:表示可以声明在构造方法上
- LOCAK_VARIABLE : 表示可以声明在成员变量上
- @Documented:用于定义注解是否可以在使用javadoc指令的时候,一同生成帮助文档
- @Inherited:用于定义注解是否具有继承性,如果某个类使用被 @Inherited修饰的注解,则其子类自动具有该注解,实际开发中,此注解使用比较少
package com.wanbangee.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited // 如果使用@Inherited修饰,那么MyAnnotation注解将具有继承性,表示如果某个类使用MyAnnotation注解,那么其子类就自动的有这个注解了
@Documented //表示在使用javadoc指令的时候,会生成帮助文档
//表示MyAnnotation可以声明在类和方法上
@Target({ElementType.TYPE,ElementType.METHOD})
//value=RetentionPolicy.RUNTIME : 表示使用MyAnnotation注解的程序在编写,编译,运行的时候都会保留这个注解
//value=RetentionPolicy.CLASS : 这是默认的策略,表示使用MyAnnotation注解的程序在编写是保留注解,但是在编译的时候不保留这个注解
//value=RetentionPolicy.RUNTIME : 表示使用MyAnnotation注解的程序在编写,编译,运行时都保留这个注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
总结:
1.要熟悉JDK提供的三个注解
2.在进行自定注解的时候,要了解元注解的使用,即每个元注解的作用