#什么是注解
注解Annotation,从JDK5.0开始引入,注解可以被其他程序读取(如编译器等)
注解在实际应用中其实已经接触过很多,比如最常见的重写的注解@OverRide,该注解有着检查和约束的作用
public class Test extends Object{
@Override
public String toString(){
return super.toString();
}
}
注解的格式: “@注释名”,还可以加一些参数值,eg:
@SuppressWarnings(value = "unchecked")
内置注解
最常见的三个内置注解
- @OverRide, 表示一个方法声明打算重写超类的方法;
- @Deprecated, 表示不鼓励程序员使用这些元素(可以是类、方法、属性),通常是因为他很危险或者存在更好的选择
- @SuppressWarnings, 表示抑制编译时的警告信息,这个注解可以使用规定好的参数
以第一个注解为例,它的内部定义如下
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
元注解
元注解的作用是负责其他注解的注解,Java中定义了4个元注解meta-Annotation,都可以在java.lang.annontation中找到。
- @Target: 用于描述注解的使用范围
- @Retention: 表示需要在什么级别保存该信息
- @Document: 说明该注解的解释保存在javadoc中
- @Inherited: 说明子类可以继承父类中的该注解
下面仿照上面注解的例子,自己定义一个简单的注解
//表示注解可以用在哪些地方
//Value是一个枚举类型,具体可以打开源码查看
@Target(ElementType.METHOD)
//表示注解在那些地方有效
//runtime > class > source
@Retention(RetentionPolicy.SOURCE)
//表示我们的注解是否生成在javadoc中
@Documented
//子类可以继承父类的注解
@Inherited
@interface MyAnnotation{
}
自定义注解
在定义一个注解时,使用@Interface时,自动继承了java.lang.Annotation接口
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@interface MyAnnotation2{
//注解的参数: 参数类型 + 参数名();
//使用default参数设置默认参数
String name() default "";
int age() default 0;
int id() default -1; //默认值为-1,代表不存在
String[] schools() default "school";
}
定义一个注解时,有一个不成文的规定,注解中只有一个参数,并命名为value时,可以忽略参数名,在注解中直接写参数。