Annotations


  • They provide information that you need to fully describe your program, but that cannot be expressed in Java.
  • In general the kind of annotations you add and what you do with them are entirely up to you.
  • Java SE5 contains three generalpurpose built-in annotations.
  • Four additional annotation types support the creation of new annotations.
  • Annotations are true language constructs and hence are structured, and are type-checked at compile time.

Basic syntax

  • Syntactically, annotations are used in much the same way as modifiers.

Defining annotations

  • Annotation definitions look a lot like interface definitions. In fact, they compile to class files like any other Java interface.
  • **@Target** defines where you can apply this annotation (a method or a field).
  • **@Retention** defines whether the annotations are available in the source code (SOURCE), in the class files (CLASS), or at run time (RUNTIME).
  • Elements look like interface methods, except that you can declare default values.

Meta-annotations

  • The meta-annotations are for annotating annotations.
  • Most of the time, you will be defining your own annotations and writing your own processors to deal with them.

Writing annotation processors

  • An important part of the process of using annotations is to create and use annotation processors.
  • Java SE5 provides extensions to the reflection API to help you create these tools.

Annotation elements

  • Note that you are not allowed to use any of the wrapper classes, but because of autoboxing this isn’t really a limitation.
  • You can also have elements that are themselves annotations.

Default value constraints

  • No element can have an unspecified value. This means that elements must either have default values or values provided by the class that uses the annotation.
  • non-primitive type elements are allowed to take null as a value, either when declared in the source code or when defined as a default value in the annotation interface.

Generating external files

  • Annotations are especially useful when working with frameworks that require some sort of additional information to accompany your source code.
  • After defining a Java class, the programmer must undergo the tedium of respecifying information like the name, package and so on—information that already exists in the original class.
  • If you define an element on an annotation with the name value, then as long as it is the only element type specified you don’t need to use the name-value pair syntax; you can just specify the value in parentheses.

Annotations don’t support inheritance

  • You cannot use the extends keyword with **@interfaces**. There doesn’t seem to be any suggestion of annotations supporting inheritance in future releases.

Implementing the processor

  • There is no inheritance of annotation interfaces, using getDeclaredAnnotations( ) is the only way you can approximate polymorphic behavior.

Using apt to process annotations

  • apt is designed to be run on Java source files rather than compiled classes. By default, apt compiles the source files when it has finished processing them.
  • The apt tool can easily group several annotation processors together. It allows you to specify multiple classes to be processed, which is a lot easier than having to iterate through File classes yourself.
  • apt works by using an AnnotationProcessorFactory to create the right kind of annotation processor for each annotation it finds.
  • When you run apt, you specify either a factory class or a classpath where it can find the factories it needs.
  • When you create an annotation processor for use with apt, you can’t use the reflection features in Java because you are working with source code, not compiled classes.

Using the Visitor pattern with apt

  • Processing annotations can become complex.
  • To prevent the complexity from scaling up badly when you have more annotations and more processors, the mirror API provides classes to support the Visitor design pattern.
  • A Visitor traverses a data structure or collection of objects, performing an operation on each one.
  • The data structure need not be ordered, and the operation that you perform on each object will be specific to its type.
  • This decouples the operations from the objects themselves, meaning that you can add new operations without adding methods to the class definitions.
  • When you use the apt tool with the Visitor pattern, you provide a Visitor class which has a method for handling each type of declaration that you visit.

Annotation-based unit testing

  • With annotations we can include the unit tests inside the class to be tested, and thus reduce the time and trouble of unit testing to a minimum.
  • This approach has the additional benefit of being able to test private methods as easily as public ones.

Thinking in Java——笔记(20)的更多相关文章

  1. Java笔记20:迭代器模式

    迭代器模式 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以Java中的容器为例,模拟Iterator的原理. 1 定义一个容器Collection接口 pub ...

  2. JAVA自学笔记20

    JAVA自学笔记20 1.递归: 1)方法定义中定义中调用方法本身的现象 2)要有出口,否则就是死递归 次数不能太多.否则内存将溢出 构造方法不能递归使用 //斐波那契数列:1,1,2,3,5,8,1 ...

  3. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  4. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  5. Java笔记 —— 继承

    Java笔记 -- 继承 h2{ color: #4ABCDE; } a{ text-decoration: none!important; } a:hover{ color: red !import ...

  6. Java笔记 —— this 关键字

    Java笔记 -- this 关键字 h2{ color: #4ABCDE; } a{ color: blue; text-decoration: none; } a:hover{ color: re ...

  7. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  8. java笔记00-目录

    --2013年7月26日17:49:59 学习java已久,趁最近有空,写一个总结: java笔记01-反射:

  9. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法

    Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...

随机推荐

  1. Excel单元格发生变化后,使用Outlook给特定的人发邮件

    自己在公司里面维护了一个小金库的Excel,当某个人的余额小于0的时候,Outlook会自动给这个人发一封邮件,同时将这个Excel附在邮件中,具体的代码如下: Public Function sen ...

  2. VB中 '&' 和 '+' 号的区别

    释义 &(Ampersand)是英语单字and之代表符号,亦可用作中文中的“和”.“与”之代表符号.这个符号源于拉丁文的et的连写. 可读做 ampersand,即 "and per ...

  3. 剖析twemproxy前言

    又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...

  4. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  5. Android sendevent/getevent 用法

    前言:最近在弄一个模拟用户点击屏幕的功能,并且不需要用户点击屏幕,后台自动给输入框赋值,类似pc端按键精灵的功能,在网上找了很多人的资料,写的都不是太详细,一知半解.还要自己慢慢研究.于是我这边写一篇 ...

  6. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

  7. JavaScript:声明变量名的语法规则

    一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...

  8. 改写yii2的listview功能

    在vendor\yiisoft\yii2\widgets路径下新增文件ListViewtest,将下列代码粘贴并保存 <?php namespace yii\widgets; use Yii;u ...

  9. ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015

    原文地址:http://hannesdorfmann.com/annotation-processing/annotationprocessing101 In this blog entry I wo ...

  10. 1Z0-053 争议题目解析698

    1Z0-053 争议题目解析698 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 698.In your production database, you: -Are using ...