Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用

下面我们来详细说说这个注解,到底是怎么一回事,一步一步看下去,总会后收获。

注解起源:Annotation(注解)是JDK5.0及以后版本引入的。在java.lang.annotation包中。

注解作用:它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。

注解格式:注解是以‘@注解名’在代码中存在的

注解分类:标记注解、单值注解、完整注解三类

另外:它都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。

元注解说,我先来上阵-----

------------------------------main-----------------------------------

一、元注解:

元注解功能:就是对其他注解进行注解。

我们它的功能划分为三类:

编写文档:通过代码里标识的元数据生成文档;

代码分析:通过代码里标识的元数据对代码进行分析;

编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

元注解包括:@Retention @Target @Document @Inherited四种。

@Target 注解:

---------------------------------------------------

@Target解释:

@Target说明了Annotation所修饰的对象范围:

Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。

在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

@Target作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

@Target 的java源码:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceTarget {

ElementType[] value();

}

备注:先解释一下 interface 表示接口,而@interface表示annotation

——————————————————————————

ElementType取值:

通过源码可以看到,ElementType ,它的取值有:

1.CONSTRUCTOR:用于描述构造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

------------------------------------------------

实例: (我们自定义了两个自定义注解,按照上面我们给出的取值含义,@table将会用于类、接口或enum声明)

@Target(ElementType.TYPE)public @interfaceTable {/*** 数据表名称注解,默认值为类名称

*@return

*/

public String tableName() default "className";

}

@Target(ElementType.FIELD)public @interfaceNoDBColumn {

}

那么到这里,我们的@Target 元注解解释完毕,有不明白地方, @企鹅:2783309477

@Retention注解:

@Retention 精简解释:

就是对自定义注解的生命周期的管理。

@Retention 详细解释:

@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而 被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将 被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制

——————————————————————————————

@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS)// 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

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

——————————————————————————————

@Retention java源码:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceRetention {

RetentionPolicy value();

}

通过源代码可以看到RetentionPolicy可取值。那么接下来

———————————————————————————————

@Retention  取值:

RetentionPolicy可取值:

1.SOURCE:在源文件中有效(即源文件保留)

2.CLASS:在class文件中有效(即class保留)

3.RUNTIME:在运行时有效(即运行时保留)

@Retention 实例:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)public @interfaceColumn {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField";public boolean defaultDBValue() default false;

}

备注:也同样,可以看出来,Column将会有在运行时有效范围。

一般格式:

@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS)// 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

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

OK,这个就解释到这里,有不明白 @小企鹅:2783309477(如是),接下来

@Documented 元注解:

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,

因此可以被例如javadoc此类的工具文档化。

Documented是一个标记注解,没有成员。

@Document java源码:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceDocumented {

}

@Document 实例:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documentedpublic @interfaceColumn {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField";public boolean defaultDBValue() default false;

}

@Inherited 元注解:

@Inherited 解释:

是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。

也就是说,如果被它修饰的annotation类型用在一个类上面,这个annotation 将被用在子类中。

注意:

1、@Inherited annotation类型是被标注过的class的子类所继承。

类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

2、当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,

则反射API增强了这种继 承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation

类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型

被发现, 或者到达类继承结构的顶层。

未完待续(自定义注解/默认注解/...)

标记注解 java_【java】细说 JAVA中 标注 注解(annotation)相关推荐

  1. Java和Android中的注解

    转载自  Java和Android中的注解 1.引言 从JDK1.5开始,引入了注解类Annotation,Annotation其实是一种接口,可以作用于类.方法.属性等等 ,它可以通过反射机制来访问 ...

  2. java web开发中Filter使用Annotation配置 (转载)

    为什么80%的码农都做不了架构师?>>>    为了在java中得到request和response对象,搜索到了 <如何在Java的普通类中获取Session以及reques ...

  3. java 反射 参数 注解_Java编程之反射中的注解详解

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  4. 子类实现父类接口时注解为啥报错_Java中的注解使用:全面性的总结一下

    前话: 今天,我们又来聊一下注解的使用,做一下详细的解析,也介绍了自定义注解,请耐心往下看哟! 注解的介绍: 在2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解 ...

  5. Java中的注解是如何起作用的

    在Java中注解是很重要的一个组成部分,它是从J2SE 5.0开始就存在的.我们在日常开发的应用中应该已经见过类似于@Override和@Deprecated注解.在这篇文章中,我讨论注解是什么,为什 ...

  6. Java中使用注解校验参数

    一.参数校验的注解 Java中参数校验的注解来自三方面,分别是 javax.validation:validation-api,对应包javax.validation.constraints org. ...

  7. Swoft 源码剖析 - Swoft 中的注解机制

    作者:bromine 链接:https://www.jianshu.com/p/ef7... 來源:简书 著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版. Swoft Github ...

  8. java 注解开发_Java中的注解到底是如何工作的?

    作者:人晓 www.importnew.com/10294.html 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Over ...

  9. Java中的注解到底是如何工作的?

    http://www.importnew.com/10294.html 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Ove ...

最新文章

  1. 记录一下mathtype输入任意形式矩阵
  2. (000) java后台开发之指导思想
  3. C语言基本运算符和表达式
  4. 数据结构(二)算法基础与复杂度
  5. vue学习笔记-02-前端的发展历史浅谈mmvm设计理念
  6. Python笔记-weditor的安装及基本使用
  7. 动态服务器以及WSGI
  8. 5月16日上午学习日志
  9. Highcharts 显示图表
  10. IOS MenuController的部分操作
  11. 【企业】走近华为,微观世界
  12. 关于 Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7的错误
  13. 深度学习-图像数据标注工具使用(LabelImg和BBox)
  14. java excel 水印_Java下载文件加文字水印(Excel、PDF、图片)
  15. 利用中文维基百科训练词向量模型
  16. 什么是商业智能BI,谈谈商业智能BI的定义与作用
  17. 163邮箱,163vip的邮箱收费标准是什么?
  18. 柳州汇商大湾区双招双引 谋定·大健康医药:李喜贵被聘顾问
  19. 微信公众号开发之流式数据读取
  20. mac 打字卡顿的解决方法

热门文章

  1. react里面的this_React 中 this指向问题
  2. el-popover可以设高度_家用餐厅吧台桌高度一般多少?吧台设计需要注意哪些?...
  3. 多线程学习(三)----死锁问题
  4. 抖音直播间弹幕protocbuf分析
  5. 软件开发提效哪有那么容易,都是坑啊~
  6. 本地存储和移动端js框架及bootstrap简介
  7. Facebook 360度音频编码与渲染
  8. Hadoop之Yarn面试知识复习
  9. Java多线程之线程虚假唤醒
  10. 微信小程序基础架构浅析