1.什么是注解
- 注解的语法:
@注解名称
; - 注解的作用: 用来替代 xml 配置文件; 在 Servlet 3.0 中就可以使用注解来代替配置文件;
- 注解是由框架来读取使用的;
- 所有的注解都是 Annotation 的子类;
- 简单说, 注解是给程序(框架)看到, 而注释是给人看的.
2. 注解的使用
- 定义注解类: 框架的工作; 语法:
public @interface MyAnnotation{....}
. - 使用注解: 程序员的工作;
- 读取注解(反射): 框架的工作;
3. 注解的属性
3.1 定义属性
- 格式: 类型 属性名();
// 定义属性 @interface MyAnno2 { int age(); // 定义属性 age String name(); // 定义属性 name String value() default "hello world!"; // value 是带有默认值的属性 }
3.2 使用注解时,给属性赋值
@MyAnno2(age=100, name="zhangsan") public class Demo{ ...... }
3.3 属性名为 value 的特权
- 当使用注解时, 如果只给名为 value 的属性赋值时,可以省略 "value=" 例如:
@MyAnno(value="hello")
可以书写成@MyAnno("hello")
3.4 注解属性的类型
- 八种基本数据类型
- String 类型
- Enum 类型
- Class 类型
- 注解类型
- 以上类型的一维数组类型
- Integer 类型不可以
@MyAnno2( // 为注解属性赋值 a=100, b="hello", c=MyEnum1.A, d=String.class, e=@MyAnno3(aa=200,bb="world"), f={"",""} // 如果数组中的元素个数为1时, 可以省略大括号 ) public class Demo{ } // 定义注解 @interface MyAnno2 { int a(); String b(); MyEnum1 c(); // Enum 类型 Class d(); MyAnno3 e(); String[] f(); // 数组类型 } @interface MyAnno3 { int aa(); String bb; }
4. 注解的作用目标限定以及保留策略限定
4.1 注解的作用目标限定
- 使用方式: 在定义注解时,给注解添加
@Target
注解;
@Target(value={ElementType.Type, ElementType.METHOD, ElementType.FIELD}) @interface MyAnno2{ } // ElementType 是枚举类型 // 可选值: TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, // ANNOTATION, PACKAGE
4.2 保留策略
- 源代码文件(SOURCE): 注解只能在源代码中存在,当编译时,就被忽略了;
- 字节码文件(CLASS): 注解在源代码中存在,然后编译时,会把注解信息放到 class 文件,但 JVM 在加载类时,会忽略注解;
- JVM (RUNTIME): 注解在源代码,字节码文件中存在,并且在 JVM 加载类时,会把注解加载到 JVM 内存中(它是唯一可反射注解!!)
// 限定注解的保留策略, Retention 为枚举类型 @Retention(RetentionPolicy.RUNTIME) @interface MyAnno2 {....}
参考资料: