前几年咱们的项目还在structs 2 上跑,有一次问一个同事是否知道
Spring Boot,同事说那不是用注解来开发的吗。虽然这个答案并不彻底对,可是从客观上Spring Boot对刚刚接触它的人来讲最醒目的就是注解了。那么今天咱们来了解一下Java语言的核心功能——注解。java
public @interface Anno { }
以上就是一个最简单的注解声明。它能够注释到类、接口、方法以及变量上。经过向方法,接口,类或字段添加注释,为其绑定的源代码分配额外的元数据。数组
经过注解咱们能够通知编译器有关警告和错误的信息在编译时操做源代码在运行时修改或检查行为。jdk提供内置5个基本注解来处理代码检查。安全
注解能够将一些元数据传递给你编写的逻辑。好比Spring Mvc 中的一个经常使用注解@RequestMapping,咱们能够经过value参数来传递一个path路径,Spring Mvc经过对请求的路径的匹配来做出是否路由到该path上。 目前大量的的框架都依赖注解,好比Spring、hibernate、dubbo等等。app
元注解是能够应用于其余注解的注解。来加强或者配置目标注解的机制。jdk目前提供了5个元注解。若是你须要开发自定义注解,请务必熟悉它们:框架
@Retention 只能用于修饰注解,来指定被修饰注解能够保留多长时间。规定了三种策略:ide
@Target 用于指定被修饰注解的修饰目标类型。若是一个注解明确了可修饰的目标类型,则只能修饰指定的类型。由枚举ElementType来规定。函数
自定义注解跟自定义接口相似,可是还有一些区别,实际开发你须要对自定义注解进行元注解注释。注解中的成员变量以无参抽象方法来声明,成员变量并非全部类型都支持,目前只支持如下类型:工具
下面咱们就来自定义一个注解:学习
/** * 声明一个能够标记在类、接口、枚举、方法上的注解。 * 而且JVM Runtime 可见、可生成文档 * * @author Dax * @since 17 :27 2019/9/4 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface Anno { /** * 若方法名为value且注解声明只须要声明value属性时, * value能够省略, @Anno("anno") 等同于 @Anno(value="anno") * * @return the string */ String value(); /** * 一个具备默认值的 String 类型属性。 * name若不显式声明,则默认值为"" 。 * 声明默认值经过 default + 默认值 来声明 * * @return the string */ String name() default ""; /** * 一个Class 类型属性,没有默认值。其余支持类型再也不举例 * * @return the class */ Class<?> clazz(); }
全部的注解都是java.lang.annotation.Annotation 的子类。只有RetentionPolicy为RUNTIME的 注解才能经过反射获取。在反射包中提供了AnnotatedElement 接口来对元素上的可捕捉到的注解进行处理。该接口是Class、Method、Constructor等程序元素对象的父接口。也就是说只要能获取程序元素对象就能对其存在的注解进行处理。主要方法有:编码
基本上对这个接口的方法进行学习后就能够知道如何获取注解的元数据了。下面咱们写一个例子,仍是上面的Anno注解为例:
/** * 被注解标记的类 **/ @Anno("hello") public class Foo {} /** * 经过获取Foo 的Class 类, * 而后就能够根据上面已经介绍的方法来获取value的值了 * @author dax * @since 2019/9/4 22:17 */ public class Main { public static void main(String[] args) { Anno annotation = Foo.class.getAnnotation(Anno.class); String value = annotation.value(); System.out.println("value = " + value); } }
今天咱们系统地对注解进行了概括,相信你已经对注解有了系统性的认识。其实注解还能够干一些花式操做,好比lombok框架。后面咱们会介绍相关的注解技术,多多关注。
关注公众号:码农小胖哥 获取更多资讯