Java:注解
注解
还记得刚开始学注解时,很天真。傻傻以为创建一个注解类,加到类、方法、属性上就能有某种功能。
现在对注解的理解很简单:标记,可以被程序读取到的标记!(注释是程序不会去执行的)
如果我们单单创建一个注解放到类或方法上面,此时并无啥用,只有编写类通过反射的手段去读取类或方法上的注解,再进行我们自己的业务逻辑代码实现。
自定义注解常识
- 定义注解是@interface,注意这不是接口,前面有@
- 注解类的属性定义是:类型 + 属性名。如 String value()
- 注解的属性类型只能是:String,Class,Enum,Annotation,上述4种类型的数组
- 在使用注解时,属性如果没有默认值,必须赋值
元注解
元注解是用来修饰我们自定义的注解。有4个内置的元注解,分别是:
- @Target
- @Retention
- @Documented(略)
- @Inherited
给个示例:
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log
@Target
@Target是用来指定自定义注解可以使用在哪些目标上。这些目标挺多,不过最常用的只有下面这些:
- ElementType.FIELD: 字段上
- ElementType.METHOD: 方法上
- ElementType.Type: 类上
- ElementType.PARAMETER:形参上
@Retention
@Retention是用来定义自定义注解的生命周期。有3个生命周期,分别是:
- RetentionPolicy.SOURCE:在源文件有效(注解在源文件时存在)
- RetentionPolicy.CLASS:在编译时及编译成class文件有效(注解在编译时存在)
- RetentionPolicy.RUNTIME:在运行时有效(注解在运行时存在,即在内存中会保留下来),这个是重点,我们能看见的大多是注解生命周期都是定义这个
@Inherited
@Inherited实际也用得很少。但稍微说一下,被他修饰的注解具有继承性。
举个例子:@Inherited修饰了注解A,注解B就能去继承注解A,不是这个意思。而是注解A用在了Person类上,Student继承了Person,那Student也能继承下来注解A