Java注解以‘@注解名’在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。
一.内置注解
1.@Override
该注解的作用为标注方法,说明所标注的方法是重写父类的方法
//抽象父类
public abstract class Mammal {
abstract void move();
}
//子类
public class Whale extends Mammal{
@Override
void move() {
System.out.println("moving...");
}
}
2.@Deprecated
在诸多方法中,有些方法(成员变量)因存在安全问题或有更好选择而不鼓励程序员使用,这时可以使用@Deprecated注解对其标注,这时在调用被标注的方法时会报出警告如下:
public class Mammal {
@Deprecated
public void move() {
System.out.println("moving...");
}
}
public class Whale{
public static void main(String[] args) {
new Mammal().move();
}
}
但是该方法是可以正常调用的:
3.@SuppressWarnings
该注解是用来消除警告的,拿上一个@Deprecated注解标注过的“过时的”方法来说,因为真正软件开发中是不允许出现警告的,此时想要消除此警告就可以用@SuppressWarnings注解。将鼠标移至警告处,便可看到如下的提示:
点击该提示,用注解@SuppressWarnings标注后警告便消除了。
public class Whale{
@SuppressWarnings("deprecation")
public static void main(String[] args) {
new Mammal().move();
}
}
二.自定义注解
上一个示例中可以看到,在注解后面接了一个参数,这是怎么回事呢?这就涉及到了注解定义的结构,下面我们说一下自定义注解。
以下是一个自定义的注解:
1.在注解名前加@interface修饰
2.可以在注解中定义属性,格式类似于抽象类中的抽象方法:[数据类型] 属性名()
3.可以用default给属性添加默认值
public @interface Over {
String value();
String name() default "Tom";
}
注意:
1.在注解的定义中没有设置默认值的属性在使用注解时必须对其进行赋值,就像下面这样:
public class Whale{
@Over(value="111")
public static void main(String[] args) {
}
}
2.如果属性名为value则赋值的时候可以省略value,就像下面这样:
public class Whale{
@Over("111")
public static void main(String[] args) {
}
}
3.如果该注解的定义中有属性为数组,则赋值时必须用{}括起来,但若只给数组赋一个值,则可以省略{}。
//注解的定义
public @interface Over {
String name() default "Tom";
String [] list();
String [] list2();
}
//为属性赋值
public class Whale{
@Over(list={"Tom","Jim"},list2= "Kate")
public static void main(String[] args) {
}
}
三.元注解
java中的元注解是用于修饰自定义注解的元注解
1.@Target
该元注解用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元注解有如下属性值:
ElementType.FIELD:应用于全局属性
//注解定义类
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
public @interface Over {
String name() default "Tom";
String [] list();
String [] list2();
}
//注解使用
public class Whale{
@Over(list={"Tom","Jim"},list2= "Kate")
int age;
public static void main(String[] args) {
}
}
ElementType.METHOD:应用于方法
//注解定义类
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
public @interface Over {
String name() default "Tom";
String [] list();
String [] list2();
}
//注解使用
public class Whale{
int age;
@Over(list={"Tom","Jim"},list2= "Kate")
public static void main(String[] args) {
}
}
ElementType.PARAMETER:应用于方法的参数
//注解定义类
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER)
public @interface Over {
String name() default "Tom";
String [] list();
String [] list2();
}
//注解使用
public class Whale{
int age;
public static void main(@Over(list={"Tom","Jim"},list2= "Kate") String[] args) {
}
}
ElementType.TYPE:应用于类、接口或者枚举声明
//注解定义类
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
public @interface Over {
String name() default "Tom";
String [] list();
String [] list2();
}
//注解使用
@Over(list={"Tom","Jim"},list2= "Kate")
public class Whale{
public static void main(String[] args) {
}
}
2.@Retention
java程序的执行过程分为编译阶段和运行阶段,@Retention元注解就是用来限制所标注的注解能保留到什么阶段。
RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解。
RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;
3.@Document
执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中。那么如何查看javadoc命令生成的文档呢?
首先,右键点击java工程,点击Export,出现下图:
然后选择在workspace的venus项目中生成doc文件:
然后在doc文件中的index文件中即可看到注解是否生成了。
4.@Inherited
如果父类所使用的注解有@Inherited修饰,则子类可以继承该注解,否则不能继承。
//注解定义类
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Over {
}
//使用@Over注解的父类
@Over
public class Mammal {
}
//未使用@Over注解的子类
public class Whale extends Mammal{
}
//测试类
import java.lang.annotation.Annotation;
public class Test{
public static void main(String[] args) {
Annotation[] annotationArray = Whale.class.getAnnotations();
for(Annotation annotation : annotationArray){
System.out.println(annotation.toString());
}
}
}
该测试类将子类中包含的注解打印出来,发现是有@Over注解的,说明Whale子类继承了Mammal父类的@Over注解,@Inherited生效了。