Java开发中注解的基本使用

Java开发中注解的基本使用,第1张

Java开发中注解的基本使用 注解
  • 又称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 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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存