对于java中注解的理解

注解

元注解

元注解是描述注解的注解,也就是解释标签的标签。

元标签有 @Retention@Documented@Target@Inherited@Repeatable 5 种。

@Retention

Retention 的中文意思是“保留,保持”。

@Retention 定义被它所注解的注解保留多久,有三种策略(SOURCE, CLASS, RUNTIME)缺省值是 CLASS

  • RetentionPolicy.SOURCE 编译器忽略
  • RetentionPolicy.CLASS 注解保留在 class 文件中,但是运行时不被 VM 保留。
  • RetentionPolicy.RUNTIME 保留至运行时。既可以在运行时通过反射去获取注解信息。

@Documented

作用是能够将注解中的元素包含到 Javadoc 中去。

@Target

Target 是目标的意思,@Target 指定了注解应用的地方,当一个注解被 @Target 注解时,这个注解就被限定了使用场景。

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

@Inherited

Inherited 是继承的意思,当一个注解 @MyAnnotation@Inherited 注解时,那么一个被 @MyAnnotation 注解的类他的所有子类都继承了该类的 @MyAnnotation
在我们现实生活中也有类似的例子,比如说: 富二代、富三代、拆二代、官二代这些标签。

@Repeatable

Repeatable 是可重复的意思,@Repeatable 是 Java8 加入的,他其实算是一语法糖,看个例子:

@Roles({@Role(name="coder"), @Role(name="artist"), @Role(name="scientist")}) 

这个注解描述了一个程序员可能同时是一个艺术家,也是一个科学家。

注解的属性

注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型, default 关键字定义了属性的缺省值。

注解的本质就是一个Annotation接口。也就是说注解中其实是可以有属性和方法,但是接口中的属性都是static final的,对于注解来说没什么意义,而我们定义接口的方法就相当于注解的属性,也就对应了前面说的为什么注解只有属性成员变量,其实他就是接口的方法,这就是为什么成员变量会有括号,不同于接口我们可以在注解的括号中给成员变量赋值。

注解属性类型可以有以下列出的类型

  • 1.基本数据类型
  • 2.String
  • 3.枚举类型
  • 4.注解类型
  • 5.Class类型
  • 6.以上类型的一维数组类型

我们看一个 Spring 里面常用的注解,一个用于映射请求路由的注解 @RequestMapping

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
}

我们可以看到 @RequestMapping 里常用的属性 value, method 等, 我们使用他的方式:

@RequestMapping(value = "/", method = RequestMethod.GET)

注解的使用

我们知道注解拥有自己的属性,那么我们需要怎么来使用呢?
通常情况下我们需要使用反射的方式去取出注解中的属性值。

总结

个人理解:注解就是用来记录一些被注解修饰的修饰者额外信息。这个信息我们可以通过反射获取到。从而进行一些其他的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值