Anntation(註解)-----Java之輔助工具(大有前途)

YX_blog發表於2015-09-04

之前Junit工具就有用到註解,可以單獨除錯程式,如 @Test ,@Override等這些就是註解。原先JUnit工具可以點選檢視點選開啟連結。現在介紹如何做出的註解

 後設資料

所謂後設資料就是資料的資料。也就是說,後設資料是描述資料的。就象資料表中的欄位一樣,每個欄位描述了這個欄位下的資料的含義。
       後設資料可以用於建立文件,跟蹤程式碼中的依賴性,甚至執行基本編譯時檢查。許多後設資料工具,如XDoclet,將這些功能新增到核心Java語言中,暫時成為Java程式設計功能的一部分。
        一般來說,後設資料的好處分為三類:文件編制、編譯器檢查和程式碼分析。程式碼級文件最常被引用。後設資料提供了一種有用的方法來指明方法是否取決於其他方法,它們是否完整,特定類是否必須引用其他類,等等。 

什麼是註解:

    Java中的註解就是Java原始碼的後設資料,也就是說註解是用來描述Java原始碼的。  基本語法就是:@後面跟註解的名稱。如 @Test.

Java中預定義註解 :(Java.Lang.Anntation)

①Override:標識某一個方法是否正確覆蓋了它的父類的方法。
②Deprecated:表示已經不建議使用這個類成員了。  它是一個標記註解。
③SuppressWarnings:用來抑制警告資訊。


自定義註解1:

自定義註解的語法很簡單,跟定義介面類似,只是在名稱前面加上@符號。 

<span style="font-size:18px;">public @interface MyAnno {
<span style="white-space:pre">	</span>}//最簡單的,不帶任何註釋的</span>
<span style="font-size:18px;">使用:</span>
<span style="font-size:18px;"><span style="white-space:pre">	</span></span><pre name="code" class="java">@MyAnno//這是限制類
public class UserModel{
} 


為註解新增成員

<span style="font-size:18px;">//定義
public @interface MyAnno {
  public String schoolName();
}</span>

使用:

<span style="font-size:18px;">
@MyAnno(schoolName="湖南城市學院")
public class UserModel{
} 
</span>
<span style="font-size:18px;">//使用2
@MyAnno(schoolName="城院Java高手訓練營")
public class UserModel{</span><span style="font-size:14px;">
}
</span>
以上只是簡單地介紹,不僅如此,還可以對註解進行註解,也就是說可以限制,是否作用於類 @Target(ElementType.TYPE),變數,方法@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE }),下面的程式碼有詳細介紹

對註解的註解:

☆指定目標 Target

在瞭解如何使用Target 之前,需要認識另一個類,該類被稱為ElementType (通過API詳細學習) ,它實際上是一個列舉。這個列舉定義了註釋型別可應用的不同程式元素。 

☆設定保持性 Retention(@Retention(RetentionPolicy.SOURCE) )編譯器要丟棄的註釋

@Retention(RetentionPolicy.Class)編譯器將把註釋記錄在類檔案中,但在執行時 VM 不需要保留註釋。這是預設的行為。

@Retention(RetentionPolicy.RUNTIME)編譯器將把註釋記錄在類檔案中,在執行時 VM 將保留註釋,因此可以反射性地讀取。 (很重要,進行類反射的時候,後面的例子會看到)

 RetentionPolicy (通過API詳細學習)列舉類中定義了3種註解保持性,分別決定了Java 編譯器以何種方式處理註解。  

☆新增公共文件 Documented

在預設的情況下在使用javadoc自動生成文件時,註解將被忽略掉。如果想在文件中也包含註解,必須使用Documented為文件註解

☆設定繼承 Inherited 

在預設的情況下,父類的註解並不會被子類繼承。如果要繼承,就必須加上Inherited註解。 

下面給出具體的例項:

註解類:

<span style="font-size:24px;">package cn.hncu.Annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE })//定義,可以使用方法,變數,
public @interface MyAnno {
	public String   getname() default "哈哈";//設定預設值,以後可以根據引數修改來進行不同的操作
//	public String   getname2() ;//不設定
}
</span>
使用註解的簡單類

/**
 * 
 */
package cn.hncu.Annotation;

/**
 * @author xinxin
 *
 */
@MyAnno
public class MyTestAnnoimp {
	@MyAnno
	private int age;
	private String name;
	
	public static void main(String[] args) {
		
	}
	@MyAnno
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "MyTestAnno [age=" + age + ", name=" + name + "]";
	}
	
	

}
對實用類進行判斷是否用到了此註解

/**
 * 
 */
package cn.hncu.Annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

/**
 * @author xinxin
 *
 */
public class Demo {
	public static void main(String[] args) throws Exception {
		
		Class c1=Class.forName("cn.hncu.Annotation.MyTestAnnoimp");
		//判斷類是否是註解型別,之前沒有@Target(ElementType.TYPE),flg一直顯示為false 
		boolean flg=c1.isAnnotationPresent(MyAnno.class);
		
		
		
		Method ms[] = c1.getDeclaredMethods();//判斷方法是否是該種型別的註解
		for(Method m: ms){
			boolean boo = m.isAnnotationPresent(MyAnno.class);
			System.out.println("mm:"+boo+"  :: "+m.getName());
		}
		
		System.out.println(MyAnno.class);
		System.out.println(flg);
		if(flg){
			MyAnno my=	(MyAnno) c1.getAnnotation(MyAnno.class);//符合就輸出做出相應的反應
		System.out.println(my.getname());
		//得到相應使用者名稱之後就可以作出相應的事了
			}else{
			System.out.println("nonono");
		}
	}
}


相關文章