Java注解(Annotation)

JDK1.5引入的一中新特性,标注在类、方法、变量、参数...上面

java注解用户为Java代码提供元数据,作为元数据,注释不直接影响你的代码执行,但也有一些类型的注释实际上可用于这一目的

定义注解,相当于定义标记,想要通过注释完成一定的功能,需要使用到注释解析,在Java反射中专门用来解析注解的方法,可直接使用 

常见的JDK内置注解:

@Override
@Deprecated
@SuppressWarnings
@SafeVarargs
@FunctionInterface
...

 元注解

专门修改注解的注解,用于自定义注解
元注解只是定义了注解,并没有完成一定的功能。

@Retention

用来表示直接将保留的阶段(源码,字节码,运行时),持久力、保持力、定义注解的生命力
注解的生命力周期有三个阶段: 
        1.Java源文件阶段
        2.class编译文件阶段
        3.运行时阶段
RetentionPolicy枚举类定义了这三个阶段

@Retention(RetentionPolicy.SOURCE) //注释存在于Java源码中,不会参与编译,也不会在运行时期起任何作用

@Retention(RetentionPolicy.CLASS)// 默认的保留策略,编译时可以处理一些动作,注释会在class字节码文件中粗壮乃,但运行时无法获取

@Retention(RetentionPolicy.RUNTIME) // 注释会在class文件中存在,在运行时可以通过反射获取

@Target

@Target用来限定注解可以使用范围,类、方法、变量、参数,ElementType枚举定义

@Target(ElementType.TYPE)作用于 接口、类、枚举、注解(最常用)
@Target(ElementType.FIELD)作用于 字段、枚举的常量
@Target(ElementType.METHOD)作用于 方法
@Target(ElementType.PARAMETER)作用于 方法参数
@Target(ElementType.CONSTRUCTOR)作用于 构造函数
@Target(ElementType.LOCAL_VARIABLE)作用于 局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于 注释
@Target(ElementType.PACKAGE)作用于 包
@Target(ElementType.TYPE_PARAMETER)作用于 类型泛型
@Target(ElementType.TYPE_USE) JDK8新推出的,可以在任意地方使用,除了class

@Documented

注解只是用来标注生成javadoc的时候是否会被记录

@Inherited

如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解

  1. 接口用上个@Inherited修饰的注解,其实现类不会继承这个注解
  2. 父类的方法用了@Inherited修饰的注解,子类也不会继承这个注解

当用了@Inherited修饰的注解的@Retention是RetentionPolicy.RUNTIME,则增强了继承性,在反射中可以获取得到 

@Repeatable

jdk8中新增的注解,使用如Spring中的@ComponentScan注解。在没有@Repeatable注解的的注解中,在同一个地方使用相同的注解会报错,有了此元注解注解的注解,就可以在同一个地方使用相同的注解。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface ComponentScans {

	ComponentScan[] value();

}


@Repeatable(ComponentScans.class)

注解类型元素

访问修饰符必须是public,不写默认public
该元素的类型只能是基本数据类型,string、class、枚举类型、注解类型、以上类的一位数组
如果注释中只有 一个元素,起名为value,元素名称一般定义为名词
()不是定义方法参数的地方,也不饿能在括号中定义任何参数,仅仅是一个特殊的语法
default代表默认值,值必须和定义的类型一样
如果没有默认值,代码后续使用注解时必须给该类型元素赋值

Method mehtod = XXXXX.class.getDeclaredMethod("方法名",int.class);
method.isAnnotationParesent(注解.class);//是否标志了该注解
method.getAnnotationPresent(注解.class);//获取标注的注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怒斥のAnthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值