目录
一、认识Java自带注解
二、自定义注解
1、认识元注解
2、自定义注解
3、注解的使用
4、反射解析注解
一、认识Java自带注解
jdk中自带了一些注解,如下四个:
@Override | 类方法的的重写注解 |
@Deprecated | 类或方法被废除的注解 |
@FunctionalInterface | 函数式接口的注解 |
@SuppressWarnings | 忽略警告的注解 |
通过反编译工具,我们可以看到,注解的本质其实是实现了Annotation接口的接口:
二、自定义注解
1、认识元注解
@Retention注解:
简单的说,@retention就是指明运行环境。
@Target注解:
简单的说,@Target就是指明作用域
查看@Deprecated注解可以看到其使用了元注解,如下:
2、自定义注解
我的自定义注解格式如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
String value() default "Dragon Wu";
int age();
String[] colors();
}
注解经jvm编译后会被转化为实现了Annotation接口的接口:
注解属性类型:
3、注解的使用
自定义注解的使用:
注意:有default的属性可以不用传,此时使用默认值,即default的;
数组属性在元素只有一个时可以省略大括号;
当属性只有一个且这个属性名为value时此时连value也可以省略:
如:@SuppressWarning("all")
4、反射解析注解
反射解析注解也是目前主流框架常用的方法,具体实现如下:
package com.dragonwu;
import com.dragonwu.customAnnotation.MyAnnotation;
@MyAnnotation(value = "Dragon", age = 100, colors = {"red", "blue", "yellow"})
public class TestDemo {
public static void main(String[] args) {
//通过反射解析注解
//获取字节码文件对象,即:获取使用了注解的对象
Class<TestDemo> c = TestDemo.class;
//通过字节码文件对象获取注解信息
MyAnnotation myAnnotation = c.getAnnotation(MyAnnotation.class);
//通过注解的属性获取对应的值
String value = myAnnotation.value();
int age = myAnnotation.age();
String[] colors = myAnnotation.colors();
System.out.println("value" + value);
System.out.println("age:" + age);
for (String color : colors) {
System.out.println("color:" + color);
}
}
}
运行结果:
可以看到注解的值已被全部获取到!
框架的底层注解使用也与此类似。