注解
概述
注释:// /**/ <!-- --!> 给人看的
注解:给程序(编译器,类加载器,JVM)看的
注解的作用:在一些使用的场景中代替实现轻量级的配置
(副作用:增加了了耦合度)
常见注解
@Override
- 重写父类方法.给编译器看,在编译时雁阵该方法是否符合重写的规则.
Override
public String toString(){
return super.toString();
}
@SuppressWarnings
- 抑制编译器
- 该注解标识的方法内部不会发出编译警告
@SuppressWarnings("unused")
public void lol(){
int x=8;
}
@Deprecated
-表示方法已经过时
@Deprecated
public static void sleep(){
}
注解的开发流程
- 定义注解->反射注解->使用注解
- @注解名称[(属性名 1=值,属性名 2=值…)]
- 使用时可以附属性赋值,也可以没有属性赋值
自定义注解
public @interface test {
}
- 底层帮我们自动实现了 java.lang.annotation.Annotatino
- 定义注解的时候只能使用@interface来定义,不能手实现
注解的属性
1. 和接口中的方法定义类似:public配型 属性名称() [default…];可以default指定默认值.
2. 如果属性定义是没有指定默认值,那么对应注解使用的时候必须为该属性赋值.
3. 如果某些场景,使用注解是必须为其中某一属性赋值,赋值完成之后该注解才可以被使用,那么不要使用default指定默认值.
4. 特殊属性value,单独危改属性赋值是,"value="可以省略;除了为value赋值以外,同时还需要为其他属性赋值,这是"value="不可以省略.
5. 属性的类型通常是巴中基本数据类型.Class类/枚举/String.
6. 为数组类型的属性赋值是,如果值只有一个,那么赋值是"{}"可以省略.
源生注解
- 在定义注解是,如果没有使用Target指定,默认都可以使用.如果使用了Target指定使用的位置,那么该注解只能在他所指定的位置使用.
@Retention
@Retention(RetentionPolicy.SOURCE):表示注解的保留域.
.java -> .class -> 加载至内存 -> 运行
SOURCE 给编译器看的,编译器看完后不再保留.生成的.class字节码文件中不再保留该类型的注解.
CLASS 给类加载器看的,在类加载是根据相关的注解做一些引导操作.编译时(.class字节码文件中保留),类加载时使用后丢弃.
RUNTIME 给JVM看的.编译器编译后保留,类加载器加载后保留,JVM执行时保留.
@Documented
- 如果在注解上定义@Documented则会在生成的javadoc中显示所使用的注解
反射注解
前提条件:注解要想被反射的到,注解的保留域必须指定为RUNTIME,否则反射不到。
jdk中提供的注解反射接口:AnnotatedElement,提供了以下方法:
xxx.getClass.getAnnotation(Class<T> annotationClass);
返回直接存在于此元素(类或接口、方法、…)上的所有注解。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。