摘要
本文針對java初學者或者annotation初次使用者全面地說明了annotation的使用方法
同時
一
在JAVA應用中
另外
二
在
annotation並不直接影響代碼語義
當然annotation在某種程度上使javadoc tag更加完整
三
通常
annotation類型的每個方法聲明定義了一個annotation類型成員
下面是一個簡單的annotation類型聲明
清單
/**
* Describes the Request
* to the presence of the annotated API element
*/
public @interface RequestForEnhancement {
int id();
String synopsis();
String engineer() default
String date(); default
}
代碼中只定義了一個annotation類型RequestForEnhancement
annotation是一種修飾符
A
清單
@RequestForEnhancement(
id =
synopsis =
engineer =
date =
)
public static void travelThroughTime(Date des
B
清單
/**
* Indicates that the specification of the annotated API element
* is preliminary and subject to change
*/
public @interface Preliminary { }
作為上面沒有成員的annotation類型聲明的簡寫方式
清單
@Preliminary public class TimeTravel {
C
清單
/**
* Associates a copyright notice with the annotated API element
*/
public @interface Copyright {
String value();
}
更為方便的是對於具有唯一成員且成員名為value的annotation(如上文)
清單
@Copyright(
public class OscillationOverthruster {
結合上面所講的
清單
import java
/**
* Indicates that the annotated method is a test method
* This annotation should be used only on parameterless static methods
*/
@Retention(RetentionPolicy
@Target(ElementType
public @interface Test { }
值得注意的是annotaion類型聲明是可以標注自己的
在上面的代碼中
下面是一個簡單的程序
清單
public class Foo {
@Test public static void m
public static void m
@Test public static void m
throw new RuntimeException(
}
public static void m
@Test public static void m
public static void m
@Test public static void m
throw new RuntimeException(
}
public static void m
}
Here is the testing tool:
import java
public class RunTests {
public static void main(String[] args) throws Exception {
int passed =
for (Method m : Class
if (m
try {
m
passed++;
} catch (Throwable ex) {
System
failed++;
}
}
}
System
}
}
這個程序從命令行參數中取出類名
下面文字表示了如何運行這個基於annotation的測試工具
清單
$ java RunTests Foo
Test public static void Foo
Test public static void Foo
Passed:
四
根據annotation的使用方法和用途主要分為以下幾類
@Deprecated用於修飾已經過時的方法
@Override用於修飾此方法覆蓋了父類的方法(而非重載)
@SuppressWarnings用於通知java編譯器禁止特定的編譯警告
下面代碼展示了內建Annotation類型的用法
清單
package com
/**
* 演示如何使用java
* 參考資料
* ml
*
*
* @author cleverpig
*
*/
import java
public class UsingBuil
//食物類
class Food{}
//干草類
class Hay extends Food{}
//動物類
class Animal{
Food getFood(){
return null;
}
//使用Annotation聲明Deprecated方法
@Deprecated
void deprecatedMethod(){
}
}
//馬類
class Horse extends Animal{
//使用Annotation聲明覆蓋方法
@Override
Hay getFood(){
return new Hay();
}
//使用Annotation聲明禁止警告
@SuppressWarnings({
void callDeprecatedMethod(List horseGroup){
Animal an=new Animal();
an
horseGroup
}
}
}
下面是一個使用annotation進行方法測試的sample
AnnotationDefineForTestFunction類型定義如下
清單
package com
import java
/**
* 定義annotation
* @author cleverpig
*
*/
//加載在VM中
@Retention(RetentionPolicy
//限定此annotation只能標示方法
@Target(ElementType
public @interface AnnotationDefineForTestFunction{}
測試annotation的代碼如下
清單
package com
import java
/**
* 一個實例程序應用前面定義的Annotation
* @author cleverpig
*
*/
public class UsingAnnotation {
@AnnotationDefineForTestFunction public static void method
public static void method
@AnnotationDefineForTestFunction public static void method
throw new RuntimeException(
}
public static void method
throw new RuntimeException(
}
public static void main(String[] argv) throws Exception{
int passed =
//被檢測的類名
String className=
//逐個檢查此類的方法
for (Method m : Class
if (m
try {
m
passed++;
} catch (Throwable ex) {
System
failed++;
}
}
}
System
}
}
這也是開發人員所常常用到的一種方式
五
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25569.html