關(guān)于JAVA注解,已經(jīng)不止一次的碰到了,但是沒(méi)有系統(tǒng)的研究過(guò)。
最近打算搞清楚以下問(wèn)題:
1. 注解的原理與使用
1.1 定義注解
使用元注解定義注解,元注解有四種:
@Target(ElementType.[type])
[type]={METHOD, FIELD, TYPE(類(lèi)、接口、枚舉聲明), CONSTRUCTOR, LOCAL_VARIABLE, PARAMETER}
@Retention(RetentionPolicy.[policy])
[policy]={SOURCE, CLASS, RUNTIME(反射機(jī)制可讀取)}
@Documented 表示將此注解包含到Javadoc中
@Inherited 表示允許子類(lèi)繼承父類(lèi)的注解
例子:
1.2使用注解
@UserCase(id=10, description="my desccription")
注意:
注解元素必須有確定的值,要么在定義注解的默認(rèn)值中指定,要么在使用注解時(shí)指定
非基本類(lèi)型的注解元素的值不可為null
注解快捷方式: 如果注解元素聲明為value(),則在使用注解時(shí)如果只聲明value,可以只寫(xiě)值,不必寫(xiě)名值對(duì)。例如可寫(xiě)為@UseCase(10)
1.3編寫(xiě)注解處理器
通過(guò)反射機(jī)制獲取注解元素的值: Method.getAnnotation(), Field.getDeclaredAnnotations()等方法
1.4注解的使用場(chǎng)景
統(tǒng)計(jì)系統(tǒng)用例實(shí)現(xiàn)情況
由JavaBean自動(dòng)生成數(shù)據(jù)庫(kù)建表SQL
1.5 JDK提供的注解工具apt
1.6 基于注解的單元測(cè)試
待續(xù)……
2. Java提供的標(biāo)準(zhǔn)注解分析。
@Override
/*
* @(#)Override.java 1.5 04/02/09
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

package java.lang;

import java.lang.annotation.*;

/**
* Indicates that a method declaration is intended to override a
* method declaration in a superclass. If a method is annotated with
* this annotation type but does not override a superclass method,
* compilers are required to generate an error message.
*
* @author Joshua Bloch
* @since 1.5
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
注解@Override的代碼非常簡(jiǎn)單,可用于注解類(lèi)的方法,并在Source級(jí)別可用。
@Deprecated
級(jí)別為Runtime
@SuppressWarnings
級(jí)別為source,經(jīng)常的使用方式為@SuppressWarnings("unchecked")
3. Spring與Junit的常用注解分析。
@Test
最近打算搞清楚以下問(wèn)題:
1. 注解的原理與使用
2. Java提供的標(biāo)準(zhǔn)注解分析。
3. Spring與Junit的常用注解分析。
4. 如何合理的設(shè)計(jì)和使用注解
1. 注解的原理與使用
閱讀了《Java編程思想》講注解的一章,整理筆記如下:1.1 定義注解
使用元注解定義注解,元注解有四種:
@Target(ElementType.[type])
[type]={METHOD, FIELD, TYPE(類(lèi)、接口、枚舉聲明), CONSTRUCTOR, LOCAL_VARIABLE, PARAMETER}
@Retention(RetentionPolicy.[policy])
[policy]={SOURCE, CLASS, RUNTIME(反射機(jī)制可讀取)}
@Documented 表示將此注解包含到Javadoc中
@Inherited 表示允許子類(lèi)繼承父類(lèi)的注解
例子:
//:annotations/UserCase.java
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCases {
public int value() default 0;
public int id() default 0;
public String description() default "no description";
}
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCases {
public int value() default 0;
public int id() default 0;
public String description() default "no description";
}
1.2使用注解
@UserCase(id=10, description="my desccription")
注意:
注解元素必須有確定的值,要么在定義注解的默認(rèn)值中指定,要么在使用注解時(shí)指定
非基本類(lèi)型的注解元素的值不可為null
注解快捷方式: 如果注解元素聲明為value(),則在使用注解時(shí)如果只聲明value,可以只寫(xiě)值,不必寫(xiě)名值對(duì)。例如可寫(xiě)為@UseCase(10)
1.3編寫(xiě)注解處理器
通過(guò)反射機(jī)制獲取注解元素的值: Method.getAnnotation(), Field.getDeclaredAnnotations()等方法
1.4注解的使用場(chǎng)景
統(tǒng)計(jì)系統(tǒng)用例實(shí)現(xiàn)情況
由JavaBean自動(dòng)生成數(shù)據(jù)庫(kù)建表SQL
1.5 JDK提供的注解工具apt
1.6 基于注解的單元測(cè)試
待續(xù)……
2. Java提供的標(biāo)準(zhǔn)注解分析。
@Override

























@Deprecated
級(jí)別為Runtime
@SuppressWarnings
級(jí)別為source,經(jīng)常的使用方式為@SuppressWarnings("unchecked")
3. Spring與Junit的常用注解分析。
@Test
4. 如何合理的設(shè)計(jì)和使用注解
使用注解標(biāo)記字段和方法,可通過(guò)反射的手段截取注解及其標(biāo)記的字段和方法的元數(shù)據(jù),并根據(jù)需求對(duì)元數(shù)據(jù)進(jìn)行處理。
它賦予了字段和方法額外的意義,提供了一種統(tǒng)一處理字段和方法的優(yōu)雅的方式。
注解更多的意義是提供了一種設(shè)計(jì)模式,在本質(zhì)上它沒(méi)有增強(qiáng)Java的能力,使用注解實(shí)現(xiàn)的功能都可以以非注解的方式實(shí)現(xiàn),只是代碼可能不是很好看而已
使用注解標(biāo)記字段和方法,可通過(guò)反射的手段截取注解及其標(biāo)記的字段和方法的元數(shù)據(jù),并根據(jù)需求對(duì)元數(shù)據(jù)進(jìn)行處理。
它賦予了字段和方法額外的意義,提供了一種統(tǒng)一處理字段和方法的優(yōu)雅的方式。
注解更多的意義是提供了一種設(shè)計(jì)模式,在本質(zhì)上它沒(méi)有增強(qiáng)Java的能力,使用注解實(shí)現(xiàn)的功能都可以以非注解的方式實(shí)現(xiàn),只是代碼可能不是很好看而已