什么是注解
语法:@注解名称
注解的作用:替代xml配置文件!
servlet3.0中,就可以不再使用web.xml文件,而是所有配置都使用注解!
注解是由框架来读取使用的!
注解的使用
- 定义注解类:框架的工作
- 使用注解:我们的工作
- 读取注解(反射):框架的工作
定义注解类
@interface MyAnnotation{}
所有的注解都是Annotation的子类!
使用注解
注解的作用目标:
* 类
* 方法
* 构造器
* 参数
* 局部变量
* 包
注解的属性
定义属性:
格式: @interface MyAnno1 { int age(); String name(); }
使用注解时给属性赋值
@MyAnno1(age=100, name="zhangSan")
注解属性的默认值:在定义注解时,可以给注解指定默认值!
int age() default 100; 在使用注解时,可以不给带有默认值的属性赋值!
名为value的属性的特权
当使用注解时,如果只给名为value的属性赋值时,可以省略“value=”
例如:@MyAnno1(value="hello"),可以书写成 @MyAnno1("hello")
注解属性的类型
– 8种基本类型
– String
– Enum
– Class
– 注解类型
– 以上类型的一维数组类型当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号
使用注解
@MyAnno1(
a=100,
b="hello",
c=MyEnum1.A,
d=String.class,
e=@MyAnno2(aa=200, bb="world"),
f=100
)
public class Demo3 {}
定义注解
@interface MyAnno1 {
int a();
String b();
MyEnum1 c();
Class d();
MyAnno2 e();
int[] f();
}
注解的作用目标限定以及保存策略
作用目标限定 @Target
让一个注解,它的作用目标只能在类上,不能在方法上,这就叫作用目标的限定!
- 在定义注解时,给注解添加注解,这个注解是@Target
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@interface MyAnno1 {
}
保留策略 @Retention
- 源代码文件(SOURCE):注解只在源代码中存在,当编译时就被忽略了
- 字节码文件(CLASS):注解在源代码中存在,然后编译时会把注解信息放到了class文件,但JVM在加载类时,会忽略注解!
- JVM中(RUNTIME):注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可反射注解!)
限定注解的保留策略
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {
}
读取注解(反射)
- 前提:注解的保留策略必须是RUNTIME
反射注解需要从作用目标上返回
- 类上的注解,需要使用Class来获取
- 方法上的注解,需要Method来获取
- 构造器上的注解,需要Constructor来获取
- 成员上的,需要使用Field来获取
Class
以及
Method、Constructor、Field的共同父类 AccessibleObject
它们都有一个方法:
Annotation getAnnotation(Class)
,返回目标上指定类型的注解!Annotation[] getAnnotations()
,返回目标上所有注解!