java注解是JDK1.5引入的一种机制,可以使用在类、方法、变量、参数或者包上,通过结合反射,aop技术,可以自己写出一个小框架。
一、常见的注解
@Override
:检查该方法是否是重写方法。Deprecated
:标记过时方法。SuppressWarnings
:指示编译器去忽略注解中声明的警告。
二、元注解
1.什么是元注解
简单明了的说,元注解就是注解的注解。
2.五种元注解
@Target
:表示注解的使用范围,范围参数如下(枚举)- ElementType.TYPE:作用于类、接口(包括注释类型)或枚举声明
- ElementType.FIELD:作用于字段(包括枚举常量)
- ElementType.METHOD:作用于方法
- ElementType.PARAMETER:作用于参数
- ElementType.CONSTRUCTOR:作用于构造函数
- ElementType.LOCAL_VARIABLE:作用于局部变量
- ElementType.ANNOTATION_TYP:作用于注释类型
- ElementType.PACKAGE:作用于包
- ElementType.TYPE_PARAMETER:作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8 加入)
- ElementType.TYPE_USE:可以用于标注任意类型除了 class (jdk1.8加入)
@Documented
:描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。@Inherited
:使被它修饰的注解能被继承(如果某个类使用了被@Inherited修饰的注解,则其子类将自动继承该注解)。@Retention
:注解保留的时间范围- RetentionPolicy.SOURCE:源文件保留,源码中可见
- RetentionPolicy.CLASS:编译器保留,class文件可见,运行时不可见(默认值)
- RetentionPolicy.RUNTIME:运行期保留,可以使用反射获取
@Repeatable
:用于指示它(元)注释的声明的注释类型是可重复的(jdk1.8加入),示例如下:
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Values.class)
public @interface Value {
String value() default "test";
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Values {
Value[] value();
}
测试类:
public class AnnotationTest {
@Value("1")
@Value("2")
public void test() {}
}
注意事项
:被@Repeatable
标注的注解Value的@Retention
范围比Values小
或者相同
。
三、自定义注解
1.注解的属性类型
- 基本数据类型
- String
- 枚举
- 注解类型
- Class类型
- 以上类型的一维数组类型
2.示例
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name();
}
疑问:注解的属性为什么有括号,返回值不能用void
答:注解中只能有静态常量,相比普通类,注解中的静态常量显然是没有什么意义的,此时其中的方法便替代成为了属性,由于本身是方法,所以带括号,与接口不同,我们可以在注解的括号中给成员变量赋值。