Java注解(一) 基本概念

写作动机

在日常的开发中,有许多地方都需要用到注解(比如@Override@Deprecated等),然后有人提到数据库关系映射(ORM)中使用注解效率会比较低。带着一些问题跟一些兴趣,决定对注解做一些了解性的学习。

这篇文章会介绍注解的基本概念,下一篇文章会介绍Java中的系统注解的使用方法,然后会有一篇文章讲解如何自定义注解跟提解注解中的值,最后会有一个简单的ORM实现原理介绍。也就是说会有几篇文章来介绍Java注解相关的知识。


概要

  • 基本概念 
    • 注解作用
    • 注解目的
  • 可注解元素

注解作用

为数据提供元数据。 
元数据:描述数据的数据,对数据及信息资源的描述性信息。

示例代码:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">BaseEntity</span>{</span>
    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Column</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id"</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String id = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"123456"</span>;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

比如上面的 User类 中的 id属性, 如果不加注解 @Column("id") ,那么它代表的仅仅的就是一个简单的类属性。

但这里 @Column("id") 注解给id加上了描述信息(id是数据库表中的列,列名为id),所以通过反射得到该属性的时候就知道该属性的描述信息(也就是知道它是代表数据库中的列,列名为id),然后就可以执行相应的数据库操作了。

所以说,注解的作用是为数据提供元数据(描述数据的数据)。

注解目的

注解也是有可见阶段的(编译时可见、构建时可见、运行时可见),所以不同阶段可见的注解有不同的目的,下面就简单介绍这三种注解。

编译时可见的注解可以用作编译时指令

比如 @Deprecated (用于声明方法或类已经过时),编译器就会检查该注解然后给出相应提示,具体看下面代码(使用IntelliJ IDE)。

User.java

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">User</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">BaseEntity</span>{</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Column</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"id"</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String id = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"123456"</span>;

<span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
 * 测试<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @Deprecated</span> 注解
 */</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Deprecated</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">deprecatedMethod</span>(){
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"I am deprecatedMethod"</span>;
}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

Test.java

使用IDE 为 IntelliJ

上面的代码中,deprecatedMethod方法就是被@Deprecated(编译时可见注解,标示已过时)注解的方法。 
当调用该方法时,编译器就会检测到deprecatedMethod@Deprecated注解了,然后就会做一些提示操作(比如画横线)。

构建时可见的注解可以用作构建时指令

构建工具检测相关的注解并做相关的操作这方面知识不熟悉,没找到相关例子,如果您对这方面有比较好的理解可以跟我讨论。

运行时可见的注解可以用作运行时指令

运行时可见的注解可以通过反射机制获取到,一些ORM框架就是通过注解来实现数据库的一些操作的(后面会有具体的讲解,此处略)。

可注解元素

  1. 所有基本类型(int、float、long等)
  2. String
  3. Class
  4. enum
  5. Annotation
  6. 以及以上类型组成的数组

总结

本篇文章主要介绍了注解是什么,注解有什么作用,跟注解可以使用的元素。现在大家对注解有了一个比较基本的概念了解,后面还会有深入的注解知识学习。

思路脑图

Java注解基本概念

完整的思维导图可以在我的github上面查找,如果觉得不错也可以给个star,地址为https://github.com/liujiescut/AndroidKnowledge

下一篇文章将介绍 Java中的系统注解的使用方法 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值