目录
1.什么是注解
注解是从 jdk5 引入的技术,它用来对程序进行声明,本身并不是程序的一部分(从这一点看相当于注释)。它可以声明在包,类,字段,方法,局部变量,方法参数的前面,对这些进行说明注释。
注解的格式:@注解名称(参数),其中的参数值可以存在也可以没有,这要看具体的注解。
2.内置注解
java 中预定义了一些注解,主要有@Override(重写),@Deprecated(过时),@SuppressWarnings( 抑制警告 ) 等
- @Override : 定义在java.lang.Override中,它只能修饰方法,表示下面的方法是从父类或者父接口继承来的,并且要重写。
- @Deprecated:定义在java.lang.Deprecated中,它可以用来修饰方法,属性,类,表示下面所修饰的方法,属性,类已经过时了,不推荐使用。
- @SuppressWarnings:定义在java.lang.SuppreddWarnings中,用来抑制编译时的警告信息。与前两个注解不同的是这个注解要添加参数才能使用。
@SuppressWarnings(“all”),@SuppressWarnings(“unchecked”),@SuppressWarnings(value={“uncheck”,“deprecation”})等等
3.元注解(mete-annotation)
元注解是用来负责注解其他注解的,java提供了四个标准的元注解来对其他注解的类型进行说明。分别是 @Target, @Retention, @Documented, @Inherited
- @Target:用来描述注解的使用范围,可选参数有TYPE(作用于类上),METHOD(作用于方法上),FIELD(作用于成员变量上)
- @Retention:表示注解被保留的阶段,可选参数有SOURCE,CLASS,RUNTIME,其中范围由大到小是RUNTIME>CLASS>SOURCE,即RUNTIME就包含了后两者的范围。所以经常用的就是RUNTIME。
- @Documented:说明注解将被包含在javadoc中
- @Inherited:说明子类可以继承父类的该注解
4.自定义注解
格式:
(public) @interface 注解名称{属性列表}
注解本质上就是一个接口,该接口在使用上面的格式自定义注解时 , 会自动继承java.lang.annotation.Annotation
接口 ,同时属性列表里的属性表示该注解要实现的功能,想要实现什么作用,就在属性里自主定义。
属性列表的属性只能在基本类型,Class,String,enum中选,不能随意定义。
属性列表的说明:
- 定义属性时,如果使用default关键字给属性默认化初始值,则使用注解时可以不用赋值,直接使用即可。
- 如果属性列表只有一个属性要赋值且属性名称是value,则value可以省略,直接定义值即可。
- 数组赋值时,值使用{}包裹,如果数组中只有一个值,则{}可以省略。
- 注解元素必须要赋值,或者default默认值,或者在使用注解时在()里自行赋值。
5.注解与反射的结合及应用
// 定义一个含参注解
// 表示自定义的注解的范围是作用于方法上
@Target(ElementType.METHOD)
// 表示注解保留的阶段是runtime,源码运行时有
@Retention(RetentionPolicy.RUNTIME)
// 说明注解将被包含在javadoc中
@Documented
// 说明子类可以继承父类的该注解
@Inherited
@interface MyAnnotation {
String username();
int age() default 30;
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class AnnotationTest {
@MyAnnotation(username = "xxx")
public void print(String username, int age) {
System.out.println(username + " " + age);
}
@Test
public void test() throws Exception {
// 把类加载进内存同时获取Class类对象
Class<AnnotationTest> clazz = AnnotationTest.class;
// 获取到AnnotationTest类的实例化对象
AnnotationTest annotationTest = clazz.newInstance();
Method print = clazz.getMethod("print", String.class, int.class);
// 获取方法上的注解
MyAnnotation myAnnotation = print.getAnnotation(MyAnnotation.class);
String username = myAnnotation.username();
int age = myAnnotation.age();
// 调用方法同时将注解的属性值传入
print.invoke(annotationTest, username, age);
}
}
最新回复