什么是注解:Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次
对比注释:注释是给开发人员阅读的,注解是给计算机提供相应信息的。
注解的作用:
编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如:@Override
代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。
编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容
JDK提供的注解
@Deprecated 表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
一般被标记位过时的方法都存在不同的缺陷:1安全问题;2新的API取代
@Override JDK5.0表示复写父类的方法;jdk6.0 还可以表示实现接口的方法
@SuppressWarnings 表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略
deprecation ,或略过时
rawtypes ,忽略类型安全
unused , 忽略不使用
unchecked ,忽略安全检查
null,忽略空指针
all,忽略所有
自定义注解:定义—基本语法:
定义注解使用关键字: @interface
定义类: class
定义接口:interface
定义枚举:enum
// #1 定义注解
@interface MyAnno1{
}
Demo例子:
创建一个注解的类,里面不写内容
package com.umanwu.anno;
public @interface anno_01 {
}
创建一个注解的类,里面写上内容
package com.umanwu.anno;
public @interface AnnoDemo {
/*
* 格式: 修饰符 返回值类型 属性名() default 默认值
* 修饰符:只能是public abstract 或者不写
* 返回值类型:基本类型,String,Class,注解,枚举,以及以上类型的一维数组
* 属性名:自定义
* 默认值:可以省略
*/
public abstract String username() default "默认值";
public Class clazz();
public anno_01 anno01();
public Color color();
public String[] hobbies();
}
enum Color{
RED,BLUE;
}
写一个测试类,测试注解
package com.umanwu.anno;
import java.sql.Date;
@AnnoDemo(username = "jack", anno01 = @anno_01, clazz = Date.class, color = Color.BLUE, hobbies = { "打球" })
public class TestAnno {
}
说明: 在上面的注解中
hobbies可以写多个值,如:hobbies = {"打球","篮球","足球"}
hobbies中有一个值的话就可以直接写成:hobbies = "打球"
对于value有这样的写法:
注意事项:
获取注解,即自定义注解-解析
package com.umanwu.anno02;
public @interface MyAnno {
public abstract String value() default "默认值";
}
package com.umanwu.anno02;
@MyAnno("测试数据")
public class MyAnnoParse01 {
public static void main(String[] args) {
boolean flag = MyAnnoParse01.class.isAnnotationPresent(MyAnno.class);
if(flag) {
MyAnno annotation = MyAnnoParse01.class.getAnnotation(MyAnno.class);
String value = annotation.value();
System.out.println(value);
} else {
System.out.println("没有注解");
}
}
}
输出结果是:没有注解.这是为什么呢?
因为每一个自定义注解,需要使用JDK提供的元注解进行修饰才可以真正的使用。需要元注解修饰自定义注解。用于控制自定义注解使用位置,生命周期等基本信息。
下面详细说明元注解:
所以我们只需要在MyAnno注解类中加上@Retention(RetentionPolicy.RUNTIME)。如下: