Java 注解入门
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 {....}
参考资料: