一、注释
首先来说注释有三种:
//
/* */
/** */
前两种编译器直接跳过,从来不阅读,第三种编译器是可以看懂的,当你使用javadoc这样的命令时会用到,用来生成api时用的。
二、注解
Annotations是一种元数据,其作用在于提供程序本身以外的一些数据信息,也就是说Annotation他不会属于程序代码本身,不参与逻辑运算,故而不会对原程序代码的操作产生直接的影响。
2.1 Java与元数据
元数据是关于数据的数据。在编程语言上下文中,元数据是添加到程序元素如方法、字段、类和包上的额外信息。
Java 元数据(Annotation)是 J2SE 5.0 (研发历时近三年,于2004年9月30日正式发布,代号为“Tiger”)新增加的功能之一,它在JSR-175规范中有详细定义。该机制允许在 Java 代码中添加自定义注释,并允许通过反射(reflection),以编程方式访问元数据注释。通过提供为程序元素附加额外数据的标准方法,元数据功能具有简化和改进许多应用程序开发领域的潜在能力,其中包括配置管理、框架实现和代码生成。
元数据的作用:
- 用于创建文档
- 跟踪代码中的依赖性
- 执行编译时检查
- 代码分析
- 元数据还可用于协助程序元素与框架或者EJB、EMF 和 TestNG这样的工具之间的通信。EJB 3.0就广泛地应用了Java元数据,通过元数据来实现声明性请求企业服务,依赖性以及资源注入,消除了严格的EJB组件模型约束,并且取代了复杂的XML配置文件
元数据甚至使我们可以不用修改核心语言,就能够在 Java 语言中添加新功能,使核心语言成为一种开放式语言。在纯面向对象的语言中实现AOP就是使用元数据进行语言扩展的一个很好的例子。AspectWerkz、JBoss AOP以及AspectJ5 使用元数据将类的语义转换为一个aspect、将数据字段转换为一个pointcut、将方法转换为一个advice,等等。
2.2 简单的运用场景
@Override
public String toString() {
return"This is String Representation of current object.";
}
上面的代码中,我重写了toString()方法并使用了@Override注解。但是,即使我不使用@Override注解标记代码,程序也能够正常执行。
那么,该注解表示什么?这么写有什么好处吗?
事实上,@Override告诉编译器这个方法是一个重写方法(描述方法的元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我不小心拼写错误,例如将toString()写成了toStrring(){double r},而且我也没有使用@Override注解,那程序依然能编译运行。但运行结果会和我期望的大不相同。
现在我们了解了什么是注解,并且使用注解有助于阅读程序。 当然这只是注解的一种使用场景而已
对于@Override注解你可能有些疑问,它什么都没做,那它是如何检查在父类中有一个同名的函数呢?
我们需要尤其注意的是,注解只是元数据,也就是说它只是一种类似vo的存储对象实例,无论想要完成任何逻辑上的处理,都需要其他代码的处理
也就是说,必然某处存在对@Override的处理
2.3 定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public@interface Override {
}
J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:
@Documented –注解是否将包含在JavaDoc中,表示是否将注解信息添加在java文档中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
@Inherited – 是否允许子类继承该注解
2.3.1 Retention
@Retention定义了该Annotation被保留的时间长短:
- 某些Annotation仅出现在源代码中,而被编译器丢弃;
- 而另一些却被编译在class文件中;
- 编译在class文件中的Annotation可能会被虚拟机忽略
- 而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。
使用这个meta-Annotation可以对 Annotation的“生命周期”限制,一般来说Annotation有如下三种使用情形:
- Information for the compiler — Annotations can be used by the compiler