1.概念
注解的作用时增强Java代码,同时利用反射技术可以扩充实现很多功能(比如,日志生成和权限认证),传统我们通过xml文本文件声明方式,而现在主流的开发都是基于注解方式,代码量最少,框架可以根据注解去生成很多的代码,从而减少代码量,程序更易读,例如最火爆的SpringBoot就是完全基于注解技术实现
注解设计非常精巧,可以超越java代码的功能,让代码变得更加强大
2.分类
- JDK自带注解
JDK自带的注解就5个
- @override——重写注解
- @Deprecated——标记这个方法已经过时了,但是我们就要用,别提示国企
- @SuppressWarning(“deprecation”)
- @SafeVarargs 堆污染,不常用
- @FunctionalInterface 配合函数式编程拉姆达表达式,不常用
- 元注解——描述注解的注解
- @Target ——自定义注解上的注解,表示注解用在哪里:类上、方法上、属性上
- @Retention———注解的生命周期:源文件中、class文件中、运行中
- @Inherited ——允许子注解继承
- @Documented ——生成javadoc式会包含注解
- @Repeatable——注解为可重复类型注解,可在一个地方多次使用,不常用
3.元注解
3.1 @Target ——Elementype.class
- 描述注解的使用范围:
字段 | 功能 |
---|---|
ElementType.ANNOTATION_TYPE | 应用于注释类型 |
ElementType.CONSTRUCTOR | 应用于构造函数 |
ElementType.FIELD | 应用于字段或属性 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.METHOD | 应用于方法级 |
ElementType.PACKAGE | 应用于包声明 |
ElementType.PARAMETER | 应用于方法的参数 |
ElementType.TYPE | 应用于类的元素 |
3.2 @Retention——RententionPolicy
- 定义了该注解被保留的时间长短,某些注解仅出现在源代码中,而被编译器丢弃;
- 而另外一些却被编译在class文件中;编译在class文件中的注解可能会被虚拟机忽略,而另一些却被编译在class文件中;编译在clss文件中的注解可能会被虚拟机忽略,而另一些在class被装在时被读取,只有不会忽略的才会被反射拿到
- SOURCE——在源文件中有效(即源文件保留)
- CLASS——在class文件中有效(即class保留)
- RUNTIME——在运行时有效(运行时保留)
3.2 注解创建和反射获取注解参数
- 注解创建
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int number() default 111;
String description() default "注解测试";
}
- 获取注解属性
public class test1119 {
@Test
public void testC(){
Class cls = annotationTest.class;
Method[] methods = cls.getMethods();
TestAnnotation annotation1 = methods[0].getAnnotation(TestAnnotation.class);
TestAnnotation annotation2 = methods[1].getAnnotation(TestAnnotation.class);
System.out.println(annotation1.number()+""+annotation1.description());
System.out.println(annotation2.number()+""+annotation2.description());
}
}
class annotationTest{
@TestAnnotation
public void testA(){
}
@TestAnnotation(number = 99,description = "新的注解")
public void testB(){
}
}