Java 注解(原理及其使用)
一、注解(annotation)介绍
Java在JDK5中引入源代码的注解机制。
1、什么是注解?
注解为代码添加了元数据,元数据是关于数据的组织、数据域及其关系的说明信息。
更通俗的说,注解为程序元素添加了更加直观的说明,这些说明信息与程序的业务逻辑无关,并且是供特定的工具或框架使用的。
注解可以被编译器嵌入在class文件中,从而使得JVM在运行时能够检索到,因此注解可以被反射;
注解可以不直接影响代码的执行,也可以通过它改变代码的执行流程。
2、注解的目标
注解是一种接口,通过反射机制相关的API能访问注解信息。程序框架或工具中的类根据这些信息来决定如何使用程序元素或改变框架自身的行为。但是注解不会影响程序代码实的实际执行。
注解的目的在于对编译器或依托框架(Spring)说明程序的某些信息,每一个注解对应于一个实际的注解类型。
3、Java中注解的作用
- 编写文档
- 编译检查
- 项目构建说明
- 运行时指令
- 跟踪代码依赖性
4、注解的使用
@注解名称(配置参数)
当注解有多个参数时,必须声明参数名称;而且注解的配置参数的值必须是编译时的常量。
注解可以被看成一个XML元素,该元素可以有不同的预定义的属性,而属性的值是可以在声明该元素的时候自行指定的。在代码中使用注解,就相当于把一部分元素据从XML文件移到了代码之中,在一个地方管理和维护,有利于保持代码和元数据的一致性。
5、创建自定义注解
步骤:
(1)通过@interface 声明注解名称,然后在{ }中声明注解的成员属性(即参数)。
(2)使用内置的元注解标注功能并对注解的使用范围进行限制。
ps:自定义注解时会自动继承java.lang.annotation.Annotation
/*Version注解*/
public @interface Version{
double number(); //注解成员类型为double,名为number。
} /*Author注解*/
public @interface Author{
String name() default "unknown"; //注解成员类型为String,名为name。
}
值得强调的是,null不能作为默认值!
注解的使用:
@Author(name="Johny")
@Version(number=1.0)
publice class MyConfig{
...
}
二、元注解(Meta-Annotation)
元注解专门用来约束其它注解,有四个:
- @Target
- @Retention
- @Documented
- @Inherited
1、@Retention
功能:定义注解被保留的持续时间,即注解的生命周期。
配置参数:RetentionPolicy
public enum RetentionPolicy{
SOURCE,
CLASS,
RUNTIME,
}
某些注解仅出现在源代码中,会被编译器丢弃;还有一些会被编译在class文件中,虽然他们会被类加载器读取,但是有可能会被JVM忽略。
(编译器默认把注解信息保留在.class文件中,为编译器或工具程序运行时提供信息)
如果程序员打算设计代码分析工具,就必须让JVM读出注解信息,以便在分析程序时使用。这时就要设置元注解@Retention的RetentionPolicy为RUNTIME,然后搭配 反射机制,通过Class类的getAnnotation()方法获得指定注解,这样就可以在运行时提取出注解的信息。
2、@Target
功能:说明注解所修饰的对象的范围
配置参数:ElementType(也是枚举类型)
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD, /** Method declaration */
METHOD, /** Formal parameter declaration */
PARAMETER, /** Constructor declaration */
CONSTRUCTOR, /** Local variable declaration */
LOCAL_VARIABLE, /** Annotation type declaration */
ANNOTATION_TYPE, /** Package declaration */
PACKAGE, /**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER, /**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
/*注解Version只能用于修饰构造方法和方法*/
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Version{
double number();
}
3、@Documented
功能:将注解的信息加入到帮助文件中,因为默认不会添加注解信息。
配置参数:没有。
使用@Documented修饰注解类型时必须同时使用@Retention,配置参数RetentionPolicy为RUNTIME。
4、@Inherited
功能:控制注解是否会影响子类,即让注解类型被继承后任然保留在子类中。
5、运行时读取注解
注解的解析完全依赖于反射机制。程序通过反射获取某个类的Class对象后,就可以调用该对象的多个方法来取得该类的注解信息。
java.lang.reflect包所提供的反射API扩充了读取运行时注解信息的能力,它新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。
三、注解与反射的应用
1、过滤方法
注解可以修饰方法,以便指定该方法的性质或类型,从而使得方法的调用者根据该注解来过滤能够调用的方法。在这类应用中,注解起到标记作用,指示方法是否符合条件。
2、自动化测试框架
测试是程序设计不可缺少的环节,是提高代码健壮性的必要手段。
但代码测试由于要覆盖不同的代码执行逻辑和路径,往往极为复杂,因此自动化测试框架能有效提高代码测试的效率,起到事倍功半的效果。
以下实例演示了如何通过注解来实现一个简单的测试框架,从而自动化地实现单元测试。这一做法在单元测试框架JUnit中大量应用。
四、单一抽象方法注解
单一抽象方法(Single Abstract Method,SAM)注解@FunctionalInterface的作用是限制接口有且仅有一个未实现的方法,当然可以有多个已经实现的default方法,显然,它是为Lambda表达式服务的。
Java 注解(原理及其使用)的更多相关文章
- java@ 注解原理与使用
Java反射 java反射机制的定义: 在运行转态时(动态的)时. 对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够知道调用它的任意属性和方法 Class对象 java中用对 ...
- Java注解原理
1. @interface不是接口是注解类,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节 2. @in ...
- Java 注解原理
下面来看看Java中注解是如何实现的 创建注解类Inter: 创建测试类Test: 在程序第二句设置断点,可以看到: 可以看到,注解的实例是一个动态代理类的对象. 要想查看这个动态代理类,可以在代码中 ...
- 深入理解Java 注解原理
*注解的用途 注解(Annotation)是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代码中的一些元信息,将一个类的外部信息与内部成员联系起来,在编 译. ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- java基础解析系列(六)---深入注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...
- Java注解的基本概念和原理及其简单实用
一.注解的基本概念和原理及其简单实用 注解(Annotation)提供了一种安全的类似注释的机制,为我们在代码中添加信息提供了一种形式化得方法,使我们可以在稍后某个时刻方便的使用这些数据(通过解析 ...
- 认识下java注解的实现原理
1,什么是注解 注解也叫元数据,例如常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注 ...
- java基础解析系列(六)---注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
随机推荐
- vuecli3.0 webpack4 配置vuex
废话不说,直接写步骤 1. npm install vux --save 2. npm install less less-loader --save-dev 3. npm install @vux/ ...
- Zookeeper系列(十)zookeeper的服务端启动详述
作者:leesf 掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6105276.html尊重原创,大家功能学习进步: 一.前 ...
- python 二分查找代码
二分查找的条件是必须是排好的数字 """二分查找""" def binary_searhc(arr, target): n = len(ar ...
- PHP学习之验证码类
<?php $code = new Code(); $code->outImage(); class Code { //验证码个数 protected $number; //验证码类型 p ...
- ObjectAnimator属性动画示例代码
import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Ac ...
- Python的并行求和例子
先上一个例子,这段代码是为了评估一个预测模型写的,详细评价说明在 https://www.kaggle.com/c/how-much-did-it-rain/details/evaluation, 它 ...
- innodb 隔离等级
前一段时间参加了一个国内知名公司的面试,被问及对数据库的了解,自感还不错,可谁知在隔离等级这种基本概念的点翻个船,也不是因为完全不懂,而是本来这里就比较晦涩,加之具体上次看这里的东西时候已经过了一年多 ...
- FlexBox布局的重要属性
/** * Sample React Native App * https://github.com/facebook/react-native * @flow */ import React, { ...
- 在SSH里面远程启动ubuntu上的GUI程序
由于嵌入式开发板上是ubuntu系统,开发板接有显示器,现有一GUI程序需要在开发板显示器上实时显示,开发板与本地通过网络SSH连接,正常情况执行如:firefox,那么firefox会显示到本地,只 ...
- linux常用命令---------------find
1.find 基本模式 find path -option [ -print ] [ -exec -ok command ] {} \; 2.常用的参数 -name name, -iname name ...