java注解笔记

注解(Annotation)

注解概述
注解概述
SE中常见的**@Override,@Deprecated**都是注解

如何去自定义Annotation

在这里插入图片描述

自定义的注解,必须配合上反射才有意义(所以说注解也叫标记确实没错)(使用反射获取注解,获取到注解之后,再根据注解中的内容,去做相应操作)

元注解

@Retention

修饰Annotation的生命周期
所以自定义的注解需要@Retention(Policy.RUNTIME) 保留到虚拟机运行中,使得反射能够获取到

在这里插入图片描述

@Target

这个也是用来修饰Annotation的,指定了这个,就是指定了,该注解能写到哪些程序元素上。
在这里插入图片描述

剩下两个

一个基本不用的@Documented

还有一个使用较少的@Inherited

在这里插入图片描述

jdk8中注解新特性

可重复注解@Repeatable

在这里插入图片描述
上代码,这样,就可以在类上面写重复的多个注解了(如果不实现MyAnnotations,是不可以写多个的),但是多个其实也没太多必要,你直接把需要多个的属性,定义成一个数组不就得了?

import java.lang.annotation.*;

@Repeatable(MyAnnotations.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    String[] value() default "hello";
}


@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@interface MyAnnotations{
    MyAnnotation[] value();
}

@MyAnnotation(value = "456")
@MyAnnotation(value = "123")
class Person{

}

类型注解

在Target属性中多出的两个注解,可修饰泛型

在这里插入图片描述

注解的原理

注解本质上是继承了 Annotation 接口的接口,而当你通过反射,也就是我们这里的 getAnnotation 方法去获取一个注解类实例的时候,其实 JDK 是通过动态代理机制生成一个实现我们注解(接口)的代理类。

参见博文https://www.cnblogs.com/yangming1996/p/9295168.html

而在动态代理中这个关键的 InvocationHandler 实例是谁?
AnnotationInvocationHandler 是 JAVA 中专门用于处理注解的 Handler, 这个类的设计也非常有意思。

自定义注解的应用

那就是反射,如果是空注解,那可能是标记,反射一旦获取到这个注解,就做一些对应的事情;
如果是非空注解,那么拿到注解的值之后,再去做一些对应的事情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值