文档章节

JDK 1.5 新特性学习笔记(4)

丽天
 丽天
发布于 2011/06/27 08:43
字数 950
阅读 520
收藏 2

 5. Annotation(注解)

Annotation是一种元数据(metadata),即“Information about information”,在源代码中标记。

注解使用类Javadoc的语法,@ANNOTATION_NAME(参数),参数为KEY=VALUE的形式。

5.1 内置注解类型

内置的注解类型位于java.lang包中,不需导入,开箱即用。

5.1.1. Override

标明方法覆写了基类的方法。此注解为一种标识注解,无参数。

JDK源码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

5.1.2. Deprecated

表明不推荐使用。此注解为一种标识注解,无参数。

JDK源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}

5.1.3. SuppressWarnings

关闭类、方法、属性等的指定编译器警告。此注解接收一个String[]类型的参数。

JDK源码如下:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

SuppressWarnings注解用法示例:

@SuppressWarnings(value={"unchecked"})
public void nonGenericsMethod( ) {
    List list = new ArrayList( );
    list.add("foo");
}

5.2 注解的注解

注解的注解即描述元数据的元数据,如上述注解的JDK源代码中的注解。

5.2.1 Target

标明注解可以作用的目标范围。

JDK源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

其中ElementType的取值为:

  • TYPE:类、接口(包含注解)、枚举类型

  • FIELD:属性(包含枚举类型的值)

  • METHOD:方法

  • PARAMETER:方法参数

  • CONSTRUCTOR:构造方法

  • LOCAL_VARIABLE:局部变量

  • ANNOTATION_TYPE:注解类型

  • PACKAGE:包

JDK源代码:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE
}

5.2.2 Retention

标明注解可以保持的范围。

JDK源码如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

其中RetentionPolicy的取值为:

  • SOURCE:源代码,编译器自动忽略
  • CLASS:类,默认设置,编译器将其记录在class文件中,但虚拟机运行时不保留
  • RUNTIME:运行时,编译器将其记录在class文件中,虚拟机运行时将其保留,可以通过反射获取
JDK源码:
public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

5.2.3 Documented

标明Javadoc文档中需包含此注解内容。

 JDK源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

注:Documented注解的使用要求注解的RetentionPolicy的设置为RUNTIME

5.2.4 Inherited

标明作用于class上的注解是被自动继承的注解。

JDK源码如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

注意:

1. Inherited注解的使用要求注解的RetentionPolicy的设置为RUNTIME

2. 接口上的注解即使是标明了@Inherited的注解,也不会被继承

3. 基类方法上的注解如果标明了@Inherited则会被继承,但在被子类覆写后也会丢失注解信息

5.3 自定义注解类型

注解类型本质上是一种Java的接口,但使用@interface关键字进行声明。

示例:

public @interface Todo {
    public enum Severity {CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION};
    String description();
    String assignedTo();
}

使用示例:

@Todo(
    severity=Todo.Severity.CRITICAL,
    description="Figure out the amount of order",
    assignedTo="Tom"
)
public void calculate() {
    // Need to finish this method later
}

5.5 新增的反射API

java.lang.reflect包中新增了AnnotatedElement接口,JDK源码如下:

public interface AnnotatedElement {
    boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
    <T extends Annotation> T getAnnotation(Class<T> annotationClass);
    Annotation[] getAnnotations();
    Annotation[] getDeclaredAnnotations();
}
  • isAnnotationPresent:判断是否标注了指定注解
  • getAnnotation:获取指定注解,没有则返回null
  • getAnnotations:获取所有注解,包括继承自基类的,没有则返回长度为0的数组
  • getDeclaredAnnotations:获取自身显式标明的所有注解,没有则返回长度为0的数组

reflect包中的相关类如Class等都实现了此接口。

注:反射要求注解的RetentionPolicy的设置为RUNTIME


© 著作权归作者所有

丽天
粉丝 63
博文 22
码字总数 14606
作品 0
南京
私信 提问
JDK 1.5 新特性学习笔记(1)

JDK 1.5/5.0在Java语言方面进行了许多增强。此文简要描述每一新特性的基本内容,便于快速了解相关知识点,更详细的描述请参考相关资料。 1. 自动装箱(Auto Boxing) 自动装箱即在基本类型(...

丽天
2010/12/19
0
0
Groovy学习笔记(1)-简介

Groovy是一种基于JVM(Java虚拟机)的面向对象的敏捷动态语言,它结合了Python、Ruby和Smalltalk的许多强大的特性(比如动态类型转换、闭包和元编程(metaprogramming)支持),Groovy 代码能...

山海经
2016/11/09
37
0
Java高级部分笔记-------Java5.0的新特性

静态导入 1.1 JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属性和方法的调用。 1.2 语法:Import static 包名.类名.静态属性|静态方法|* ...

查封炉台
2014/04/21
0
0
jdk源码阅读笔记-ArrayList

一、ArrayList概述 首先我们来说一下ArrayList是什么?它解决了什么问题?ArrayList其实是一个数组,但是有区别于一般的数组,它是一个可以动态改变大小的动态数组。ArrayList的关键特性也是...

编程SHA
2018/11/11
0
0
java基础学习_JDK新特性_day28总结

java基础学习JDK新特性day28总结 ==================================================================================================================================================......

黑泽明军
2018/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java设计模式-模板方法模式

定义 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changi......

别打我会飞
33分钟前
2
0
百度T8架构师细谈Java架构进阶扫盲清单!(附图文)

普通程序员写代码叫编码,而架构师写代码就叫架构设计。这是因为他们在编码时考虑的角度完全不同。普通程序员只需要考虑如何实现功能,而优秀的程序员(预备架构师)却更多考虑性能、可读性、...

编辑之路
36分钟前
1
0
lombok的一个踩坑记录

lombok的类如下所示: package com.divx.service.model.task;import com.divx.service.model.BaseTypeMedia;import lombok.Data;/** * @author wuzhilang * @Title: QuestionResult ......

无知的小狼
今天
2
0
如何使用markdown

我没有导入相应的包 这个用的还是有些问题 而且显示的时候格式问题还没解决 <div class="blog_editor" style="margin: 0 auto;width:60%;height:1000px;background-color: white;"> <div s......

南桥北木
今天
4
0
纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。 代码实现。 1.pom.xml文件,需要依赖的jar...

Java老王
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部