注解(也被稱為元數(shù)據(jù))為我們?cè)诖a中添加信息提供了一些形式化的方法愕难,是我們?cè)谏院蟮哪硞€(gè)時(shí)刻早龟,可以非常方便的使用這些數(shù)據(jù)
注解的語法比較簡(jiǎn)單,除了@符號(hào)使用之外猫缭,他與java語法一致葱弟,javaSE5內(nèi)置了三種,java.lang中的注解
- @Override 表示當(dāng)前的方法定義將覆蓋超類中的方法
- @Deprecated 如果程序員使用了注解為他的元素猜丹,那么編譯器將發(fā)出警告信息
- @SuppressWarnings 關(guān)閉不當(dāng)?shù)木幾g器警告信息
一. 基本語法
import org.junit.Test;
public class TestTable {
public void excute(){
System.out.println("");
}
@Test
public void testExecute(){
}
}
可以看出被注解的方法與其他方法并無區(qū)別芝加,注解@Test可以與任何修飾符作用于方法
二. 定義注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD) //表示注解應(yīng)用于方法
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
}
可以看出注解的定義很像接口的定義,他與java接口一樣會(huì)編譯成class文件,定義注解時(shí),會(huì)需要一些元注解,如:@Target,@Retention
- @Target 用來定義你的注解應(yīng)用在什么地方(例如是一個(gè)方法還是類)
- @Rectetion 用來定義注解在哪一級(jí)別可用射窒,在源代碼中(SOURCE)藏杖,類文件中(CLASS)或者運(yùn)行時(shí)(RUNTIME)
三. 原注解
java 目前只內(nèi)置了三種標(biāo)準(zhǔn)注解将塑,四種原注解
注解 | 說明 |
---|---|
@Target | 表示該注解可用于什么地方◎螋铮可能的ElementType的參數(shù)包括:CONSTRUCTOR:構(gòu)造器的說明 FIELD:域說明(包括enum實(shí)例) LOCAL_VARIABLE 局部變量聲明 METHOD:方法聲明 PACKAGET:包的說明 PARAMETER:參數(shù)的說明 TYPE:類或接口 |
@Retention | 表示需要在什么級(jí)別保存該信息 点寥。可選的RetentionPolicy: SOURCE:注解將被編譯器丟棄 CLASS:注解將在CLASS文件中可用来吩,但在VM中將被丟棄 RUNTIME:VM將在運(yùn)行期也保留注解敢辩,因此可用通過反射機(jī)制讀取注解的信息 |
@Docemented | 將此注解包含在javadoc中 |
@Inherited | 表示子類允許繼承父類的注解 |
四. 編寫注解處理器
如果沒有用來讀取注解的工具,那么注解也不會(huì)比注釋更有用弟疆。在javaSE5擴(kuò)展了反射機(jī)制的API戚长,以幫助程序員實(shí)現(xiàn)這類工具
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//@Retention 用來定義該注解在哪一級(jí)可以用
//@Target元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserCase {
public int id();
public String description() default "no description";
}
public class PasswordUtils {
@UserCase(id=10,description="validatePassword")
public boolean validatePassword(String password){
return(password.matches("\\w*\\d\\w*"));
}
@UserCase(id=18)
public String encryptPassword(String password){
return new StringBuilder(password).reverse().toString();
}
@UserCase(id=108,description="checkForNewPassword")
public boolean checkForNewPassword(String password){
return true;
}
}
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class UserCaseTracker {
public static void trackUserCases(List<Integer> userCase,Class<?> cl){
for(Method m : cl.getDeclaredMethods()){
UserCase u = m.getAnnotation(UserCase.class);
if(u != null){
System.out.println("Found Use UserCase:"+u.id()+"\t"+u.description());
userCase.remove(new Integer(u.id()));
}
}
for(int i : userCase){
System.out.println("Miss user UserCase "+i);
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 16,108,10,50);
trackUserCases(list,PasswordUtils.class);
}
}
五. 編寫注解處理器
標(biāo)簽@UserCase由UserCase.java定義,其中包含int元素id,String元素description,注解的可用類型如下所示:
- 所有的基本類型(int,float,boolean等)
- String
- Class
- Annotation
- 以上類型的數(shù)組
注意:元素不能有不確定的值兽间,要么具有默認(rèn)的值历葛,要么給元素提供元素的值
注解