什么是注解
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
java注解分类
1 JDK基本注解
@Override :重写 |
---|
@Deprecated:已过时 |
@SuppressWarnings(value = “unchecked”) : 压制编辑器警告 |
2 JDK元注解
JDK中有一些元注解,主要有@Target,@Retention,@Document,@Inherited用来修饰注解。
@Target
表明该注解可以应用的java元素类型,指定被修饰的Annotation可以放置的位置(被修饰的目标)@Target(ElementType.TYPE) | 应用于类、接口(包括注解类型)、枚举 |
---|---|
@Target(ElementType.FIELD) | 应用于属性(包括枚举中的常量) |
@Target(ElementType.METHOD) | 用于方法 |
@Target(ElementType.PARAMETER) | 用于方法参数 |
@Target(ElementType.CONSTRUCTOR) | 用于构造函数 |
@Target(ElementType.LOCAL_VARIABLE) | 用于局部变量 |
@Target(ElementType.ANNOTATION_TYPE) | 用于注解 |
@Target(ElementType.PACKAGE) | 用于包 |
@Target可以指定多个位置,例如:
@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用
@Retention
表明该注解的生命周期,定义注解的保留策略@Retention(RetentionPolicy.SOURCE) | 表明注解仅存在于源码中,在class字节码文件中不包含 |
---|---|
@Retention(RetentionPolicy.CLASS) | 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 |
@Retention(RetentionPolicy.RUNTIME) | 注解会在class字节码文件中存在,在运行时可以通过反射获取到 |
@Inherited:指定被修饰的Annotation将具有继承性
@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档
自定义注解
声明注解组成;
1.修饰符
访问修饰符必须为public,不写默认为pubic;
2.关键字
关键字为@interface;
3.注解名称
注解名称为自定义注解的名称,使用时还会用到;
4.注解类型元素
注解类型元素是注解中内容,可以理解成自定义接口的实现部分;
案例:
TestAnnotation 注解:作用在属性,运行时可以通过反射获取到@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TestAnnotation {
String value() default "默认value值";
String what() default "这里是默认的what属性对应的值";
}
使用注解
public class Demo2 {
@TestAnnotation(value = "这就是value对应的值_msg1", what = "这就是what对应的值_msg1")
private static String msg1;
@TestAnnotation("这就是value对应的值1")
private static String msg2;
}
测试反射解析注解
public class Demo2Test {
@Test
public void test1() throws Exception {
TestAnnotation msg1 = Demo2.class.getDeclaredField("msg1").getAnnotation(TestAnnotation.class);
System.out.println(msg1.value());
System.out.println(msg1.what());
}
@Test
public void test2() throws Exception{
TestAnnotation msg2 = Demo2.class.getDeclaredField("msg2").getAnnotation(TestAnnotation.class);
System.out.println(msg2.value());
System.out.println(msg2.what());
}
}