文章目录

  • 什么是注解
  • 注解的使用
  • 定义注解类
  • 使用注解
  • 注解的属性
  • 注解的作用目标限定以及保存策略
  • 作用目标限定 @Target
  • 保留策略 @Retention
  • 读取注解(反射)



 

什么是注解

语法:@注解名称
注解的作用:替代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(),返回目标上所有注解!