公众号「稀有猿诉」 原文链接 Java Annotations Made Easy
在Java编程语言中,注解Annotations是一种元数据,能提供代码以外的信息,是元编程的一种体现形式。注解的引入极大的增强了Java语言的元编程能力,能在编译时生成代码,大大减少了重复代码,让Java具有了相当高的动态特性,让一些高级技术如依赖注入,AOP等成为可能。今天将从基础使用,核心概念理解和创建自定义注解三个角度来彻底学会注解,并学会使用注解来提升开发效率。
基础知识
注解在代码中使用是非常常见的,相信只要有编程经验的同学都对注解非常的熟悉。
什么是注解
Java 注解(Annotation)是JDK5.0及以后版本引入的,它可以用于创建文档,代码分析,编译检查以及编译时生成代码。Java 注解是接口的一种特殊实现,程序可以通过反射来获取指定程序元素的Annotion对象,然后使用该对象来获取注解里面的元数据。
注解的用法
注解的使用是非常简洁明了的,Java 注解的基本语法是使用“@”符号来定义一个注解,然后在这个符号后面跟上注解的名字,并在这个名字的后面添加一个括号,括号中是这个注解所需要的参数列表。Java 注解是接口的一种特殊实现,因此注解的定义方式类似于接口的定义方式。Java 注解可以分为三种类型:标记注解、单值注解和完整注解。标记注解没有成员变量,只有一个标记作用;单值注解有一个成员变量;完整注解有多个成员变量。
内置注解
Java内置了一些注解,相信写过代码或者看过代码的人都对此非常的了解,因为在代码中是非常非常的常见的。
- @Override - 用于类的方法上,标记该方法要覆写基类(包括接口)的方法。编译器会对标记的方法作签名检查是否符合覆写规则。
- @Deprecated - 可以标记类,成员变量和成员方法为过时的方法,编译器会对调用这些类,成员或者方法给出警告(Compile warnings)。
- @SuppressWarnings - 可以用在类和方法上,强制忽略编译警告,即阻止编译器发出编译警告。后面需要加括号,里面传入字符串或者字符串数组代表要忽略的警告类型。
- @FunctionalInterface - 这是在Java 8版本中引入的,用在接口上,标记接口是一个函数式接口(即只有一个方法的接口,可以直接用一个lambda来作为接口的实例)。
- @SafeVarargs - 用于方法和构造方法上,断言varargs参数(即可变长参数)会被安全地使用。比如涉及泛型的可变长参数会有『unchecked』警告,加了@SafeVarargs时编译器不会再给出『unchecked』警告。
通过这些内置注解可以了解注解的类型和特点,并掌握注解的使用方法,这是学习自定义注解,即注解高级玩法的基础。
理解注解
可以发现注解并不直接对其修饰的代码产生影响,它是为代码提供额外的信息,它是代码的元数据,注解与代码一起构成了编译器的完整输入,编译器借助注解可以生成并得到最终完整的代码。
注解本身无论是使用还是定义都相对直观和简洁,非常容易理解,因为注解本身就是一种元数据,提供一种标记或者额外的数据。重点在于注解的处理,这是注解功能发挥作用的地方也就是注解功能逻辑实现的地方。
元编程
注解是程序的元数据,所以这属于元编程范畴。元编程Metaprogramming也即是以代码为操作目标和目标输出的编程范式,元编程是生产力工具,可以减少重复代码,大大的提高代码开发效率。大多数通用编程语言都支持元编程,像C/C++语言中的宏,Java中的注解,反射和动态代理,大Python中的装饰器(Decorators装饰器是高阶函数对函数进行操作)和元类(Metaclasses,对类进行操作可理解为类的模板)等等都是元编程。
优秀的框架(Spring)和领域驱动开发(DDD)都是元编程的典型应用。
关于Java的元编程,推荐这两篇文章:
注解的分类
注解是向编译器提供额外信息的一种元编程机制,那