1 自定义注解描述
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
1.1 创建一个注解的基本元素
- 修饰符
访问修饰符必须为public,不写默认为pubic - 关键字
关键字为@interface - 注解名称
注解名称为自定义注解的名称,例如下面的示例的 LogAnnotation 就是注解名称 - 注解类型元素
注解类型元素是注解中内容,根据需要标志参数,例如上面的注解的value
1.2 元注解(@Target、@Retention、@Inherited、@Documented)
我们上面的创建的注解 LogAnnotation 上面还有几个注解(@Target、@Retention、@Inherited、@Documented), 这四个注解就是元注解,元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的元注解类型,它们被用来提供对其它 注解类型作标志操作(可以理解为最小的注解,基础注解)
@Target:用于描述注解的使用范围,该注解可以使用在什么地方
| Target类型 | 描述 |
|---|---|
| ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
| ElementType.FIELD | 应用于属性(包括枚举中的常量) |
| ElementType.METHOD | 应用于方法 |
| ElementType.PARAMETER | 应用于方法的形参 |
| ElementType.CONSTRUCTOR | 应用于构造函数 |
| ElementType.LOCAL_VARIABLE | 应用于局部变量 |
| ElementType.ANNOTATION_TYPE | 应用于注解类型 |
| ElementType.PACKAGE | 应用于包 |
备注:例如@Target(ElementType.METHOD),标志的注解使用在方法上,但是我们在这个注解标志在类上,就会报错
@Retention:表明该注解的生命周期
| 生命周期类型 | 描述 |
|---|---|
| RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
| RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
| RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
@Inherited:是一个标记注解,
@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Documented:表明该注解标记的元素可以被Javadoc 或类似的工具文档化
2 示例
2.1 创建自定义注解类
public @interface LogAnnotation {
}
2.2 指定注解类对象
@Target(ElementType.METHOD)
public @interface LogAnnotation {
}
2.3 指定注解类运行时间
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
}
2.4 定义注解参数
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
String target() default "";
}
2.5 使用
@LogAnnotation(target="123")
public void function testF(){
}