专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
51好读  ›  专栏  ›  ImportNew

Java 注解指导手册(上)

ImportNew  · 公众号  · Java  · 2017-02-13 20:41

正文

请到「今天看啥」查看全文



其它因素也促成了这个决定:当时不同类型的应用程序使用XML作为标准的代码配置机制,这其实并不是最佳方式,因为代码和XML的解耦以及未来对这种解耦应用的维护并不低廉。另外,由于非保留字的使用,例如“@deprecated”自从Java1.4便开始在Java文档中使用。我非常确定这是一个现在在注解中使用“@”原因。


包含注解的设计和开发的Java规范主要有以下两篇:


  • JSR 175 A metadata facility for the Java programming Language


    https://www.jcp.org/aboutJava/communityprocess/final/jsr175/index.html


  • JSR 250 Common Annotations for the Java Platform


    https://jcp.org/en/jsr/detail?id=250


2. 介绍


解释何为注解的最佳方式就是元数据这个词:描述数据自身的数据。注解就是代码的元数据,他们包含了代码自身的信息。


注解可以被用在包,类,方法,变量,参数上。自Java8起,有一种注解几乎可以被放在代码的任何位置,叫做类型注解。我们将会在后面谈到具体用法。


被注解的代码并不会直接被注解影响。这只会向第三系统提供关于自己的信息以用于不同的需求。


注解会被编译至class文件中,而且会在运行时被处理程序提取出来用于业务逻辑。当然,创建在运行时不可用的注解也是可能的,甚至可以创建只在源文件中可用,在编译时不可用的注解。


3.消费器


理解注解的目的以及如何使用它都会带来困难,因为注解本身并不包含任何功能逻辑,它们也不会影响自己注解的代码,那么,它们到底为什么而存在呢?


这个问题的解释就是我所称的注解消费器。它们是利用被注解代码并根据注解信息产生不同行为的系统或者应用程序。


例如,在Java自带的内建注解(元注解)中,消费器是执行被注解代码的JVM。还有其他稍后谈到的其他例子,例如JUnit,消费器是读取,分析被注解代码的JUnit处理程序,它还可以决定测试单元和方法执行顺序。我们会在JUnit章节更深入。


消费器使用Java中的反射机制来读取和分析被注解的源代码。使用的主要的包有:java.lang, java.lang.reflect。我们将会在本篇指南中介绍如何用反射从头开始创建一个自定义的消费器。


4. 注解语法和元素


声明一个注解需要使用“@”作为前缀,这便向编译器说明,该元素为注解。例如:


@Annotation

public void annotatedMehod() {

...

}


上述的注解名称为Annotation,它正在注解annotatedMethod方法。编译器会处理它。注解可以以键值对的形式持有有很多元素,即注解的属性。


@Annotation(

info = "I am an annotation",

counter = "55"

)

public void annotatedMehod() {

...

}


如果注解只包含一个元素(或者只需要指定一个元素的值,其它则使用默认值),可以像这样声明:


@Annotation("I am an annotation")

public void annotatedMehod() {

...

}


就像我们看到的一样,如果没有元素需要被指定,则不需要括号。多个注解可以使用在同一代码上,例如类:


@ Annotation (info = "U a u O")

@ Annotation2

class AnnotatedClass { ... }


一些java本身提供的开箱即用的注解,我们称之为内建注解。也可以定义你自己的注解,称之为子定义注解。我们会在下一章讨论。


5. 在什么地方使用


注解基本上可以在Java程序的每一个元素上使用:类,域,方法,包,变量,等等。


自Java8,诞生了通过类型注解的理念。在此之前,注解是限于在前面讨论的元素的声明上使用。从此,无论是类型还是声明都可以使用注解,就像:


@MyAnnotation String str = "danibuiza";







请到「今天看啥」查看全文