@Retention注解的应用场景

@Retention注解的应用场景

1,SOURCE:在源文件中有效(即源文件保留)

2.CLASS:在class文件中有效(即class保留)

3.RUNTIME:在运行时有效(即运行时保留)

源码:

APT: 在编译期能够获取注解与注解声明的类包括类中所有的成员信息,一般用于生成额外的辅助类。

IDE语法检查:在android开发中,(support-annotations与androidx.annotation)中均有提供@IntDef注解,次注解的定义如下:

@Retention(SOURCE)
@Target({ANNOTATION_TYPE})
public @interface IntDef {
    int[] value() default {};
    boolean flag() default false;
    boolean open() default false;
}

java中Enum(枚举)的实质是特殊单例的静态成员变量,在运行期所有枚举类作为单例,全部加载到内存中。比常量多5到10倍的内存占用。

此注解的意义在于能够取代枚举,实现方法入参限制。

如:我们定义方法test,此方法接收参数teacher需要在:aaa,bbb中选择一个,如果使用枚举实现为:

    public enum Teacher{
        aaa,bbb
    }
    
    public void test(Teacher teacher) {
        
    }

而现在为了进行内存优化,我们现在不在使用枚举,则方法定义为:

    public static final int AAA = 1;
    public static final int BBB = 2;

    public void test(int teacher) {

    }

然而此时,调用test方法由于采用基本数据类型int,将无法进行类型限定,此时使用@IntDef增加自定义注解:

    public static final int AAA = 1;
    public static final int BBB = 2;
    
    @IntDef(value = {AAA,BBB}) //限定为aaa,bbb
    @Target(ElementType.PARAMETER) //作用于参数的注解
    @Retention(RetentionPolicy.SOURCE) //源码级别的注解
    public @interface Teacher {
        
    }

    public void test(@Teacher int teacher) {

    }

此时,我们再去调用test方法,如果传递的参数不是AAA或者BBB则会显示Inspection警告(编译不会报错)。
在这里插入图片描述
可以修改此类语法检查级别:
在这里插入图片描述
以上注解均为SOURCE级别,本身IDEA/AS都是由java开发的,工具实现了对java语法的检查,借助注解能对被注解的特定语法进行额外检查。

字节码:

字节码增强:在编译出Class后,通过修改Class数据以实现修改代码逻辑目的,对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。

运行时:

反射:在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值