- 又称Java标注,JDK5.0引入的一种注释机制。
- 元数据的一种形式,提供有关于程序但不属于程序本身的数据。
- 注解对其所注解的代码的 *** 作没有直接的影响。
新建Class文件时,选择Annotation:
定义语法,使用@interface修饰:
public @interface MyAnnotation { // TODO: 12/16/21 do something }
在Java语言中,所有的注解都实现了Annotation接口:
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class extends Annotation> annotationType(); }元注解
对注解类型进行注解的注解类,称之为元注解(meta-annotation)。
@Target(ElementType.TYPE) public @interface MyAnnotation { // TODO: 12/16/21 do something }
注解Target为自定义注解MyAnnotation的一个元注解。
元注解的分类- @documented 用于被javadoc工具提取文档
- @Inherited 表示允许子类继承父类中定义的注解
- @Target 表明被标记注解在Java普通类中的使用范围
- @Retention 指定被标记注解的存储方式
一般情况下,自定义注解时,需要指定的元注解为@Target和@Retention。
@Target
package java.lang.annotation; @documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
ElementType元素类型有以下值:
package java.lang.annotation; public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER, TYPE_USE }
- TYPE 表明被标记注解可以应用于类
- FIELD 表明被标记注解可以应用于类的字段或属性
- METHOD 表明被标记注解可以应用于类的方法
- PARAMETER 表明被标记注解可以应用于方法的参数
- ConSTRUCTOR 表明被标记注解可以应用于构造函数
- LOCAL_VARIABLE 表明被标记的注解可以应用于类的局部变量
- ANNOTATION_TYPE 表明被标记的注解可以应用于注解类型
- PACKAGE 表明被标记的注解可以应用于包声明
- TYPE_PARAMETER 表明被标记的注解可以应用于类型参数的声明
@Target({ElementType.TYPE,ElementType.FIELD}) public @interface MyAnnotation { // TODO: 12/16/21 do something }
@MyAnnotation public class MainActivity extends AppCompatActivity { @MyAnnotation private String value1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public static void main(String[] args) { } }
@Retention
package java.lang.annotation; @documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); }
RetentionPolicy有以下取值:
package java.lang.annotation; public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
- SOURCE 表明被标记的注解保留在代码源码中,编译器会将其忽略。
- CLASS 表明被标记的注解在编译时由编译器保留,但JVM会忽略。
- RUNTIME 表明被标记的注解由JVM保留,在运行时环境可以使用。
@Target({ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { // TODO: 12/16/21 do something }注解类型元素
自定义注解中的元素。
注解在使用时,允许传递参数。
@Target({ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value(); int id() default 0; }
在使用注解时,需注意:
- 元素没有默认值,在使用注解时,必须对其赋值。
- 元素有默认值时,根据需要,可对其重新赋值。
- 只有value元素时,可省略键值对的赋值方式。
@MyAnnotation("value") public class MainActivity extends AppCompatActivity { @MyAnnotation(value = "value2", id = 1) private String value1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public static void main(String[] args) { } }注解的应用场景
根据元注解@Retention定义的存储方式,注解可分为三种应用场景:
- SOURCE 源码级别的注解,应用在IDE语法检查、apt技术中。
- CLASS 级别的注解中,注解被保留在.class文件中,但不会被JVM记录,与之对应的便是javac命令生成的.class字节码文件,故而被应用于字节码的 *** 作中,直接修改字节码class文件达到修改代码相关逻辑的 *** 作,广泛应用于热修复技术中。
- RUNTIME 注解保留至运行时,可结合反射技术获取注解中的信息。
成长路线 - Android移动开发架构师
面试宝典 - 你离升职加薪仅一步之遥
坤哥杂谈 - 梦想总是要有的,万一实现了呢
Android常用开源库
Android开发知识梳理、分享
APP架构搭建 - MVP基础版
博客知识体系 - 软件开发基础
个人独立博客 https://karenchia.gitee.io
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)