|
Metadata,元數(shù)據(jù),是Tiger重要的改進(jìn)之一,也叫注釋(Annotate),這個改進(jìn)的前身,有大家熟悉的JavaDoc。
作為重要的改進(jìn),不少開發(fā)組織已經(jīng)越來越多的開始使用元數(shù)據(jù),如EJB3中將大力采用元數(shù)據(jù)。元數(shù)據(jù)作為附加數(shù)據(jù)或注釋,可以被javac編譯器或其他工具讀取,并根據(jù)不同的屬性指定,可以選擇被保存在類文件中,也可以保存到運(yùn)行時,并通過Java的反射機(jī)制提供調(diào)用,從而提供了廣闊的使用空間,相信今后的Java開發(fā)中大家少不了要熟練掌握和使用它。
元數(shù)據(jù),定義是數(shù)據(jù)的數(shù)據(jù),比如做數(shù)據(jù)挖掘時,依據(jù)原始的數(shù)據(jù)提取出的供上層管理人員查看和分析的數(shù)據(jù)(上層管理人員更關(guān)注他們關(guān)注的數(shù)據(jù),而不是基礎(chǔ)業(yè)務(wù)數(shù)據(jù)),上述所提的原始數(shù)據(jù)就叫元數(shù)據(jù)。
元數(shù)據(jù)有3類作用:文檔編制、編譯器檢查和代碼分析。
先簡單介紹3個Tiger內(nèi)置的元數(shù)據(jù): Override、Deprecated和SuppressWarnings。
注釋的使用通過"@"+注釋名稱的方式,@為我們熟悉的at標(biāo)記,如果注釋后面有參數(shù),則使用paraName = paraValue的方式,類似方法的調(diào)用。
1)Override: 聲明Override父類的方法,如果父類無此方法將提示錯誤,可以避免錯誤:
@Override public String toString() { return super.toString(); } |
表示Override toString方法,如果把toString改為ToString,則編譯會報錯誤表示必須Override父類的方法。
2)Deprecated: 用于對不應(yīng)再使用的方法進(jìn)行注釋,如果覆蓋或調(diào)用聲明為Deprecated的方法,編譯器將提示警告。 Deprecated的使用比較特殊,必須放在方法前:
@Deprecated public doSomething() { ... ... } |
3)SuppressWarnings: 是Tiger的所有新功能的副功能,如我們在使用5.0的jdk編寫jdk1.4.x和以前版本jdk的應(yīng)用時,會發(fā)現(xiàn)常使用的方法在編譯時會報出一大堆的警告,如:List testList = new ArrayList(); 會警告沒有定義類型,不是類型安全的代碼,此時需要在含此定義的方法里,使用該 SupperssWarnings:
@SuppressWarings(value={"unchecked"}) public void test() { List testList = new ArrayList(); testList.add("test"); } |
以上是內(nèi)置的注釋,接下來看看怎么定義自己的注釋類型,這才是最可以擴(kuò)展和值得關(guān)注的部分:
定義一個注釋類型:
|
package javayou.demo.j2se5; import java.lang.annotation.*;
/** * 注釋的保持特性, * 此處定義注釋類型AuthorDetail將保留至JVM裝載,供JVM讀取 */ @Retention(RetentionPolicy.RUNTIME)
/* * 定義元注釋,即允許何種程序元素具有定義的注釋類型, * 避免在其他地方誤用此注釋 */ @Target(ElementType.METHOD)
/** * 定義一個注釋類型,需要在interface前加:@ */ public @interface AuthorDetail { //定義有3個屬性 String name(); String email(); String callExtension(); } |
使用例子:
|
package javayou.demo.j2se5; import java.lang.annotation.Annotation;
public class MetadataDemo { @AuthorDetail(name="Liang.xf", email="javayou@", callExtension="351") public void demo() { System.out.println("MetadataDemo方法調(diào)用"); } public static void main(String[] args) { MetadataDemo metadata = new MetadataDemo(); try { Annotation[] annotation = metadata.getClass( ).getMethod("demo").getAnnotations(); for (Annotation a : annotation) { System.out.println("作者: "+ ((AuthorDetail) a).name()); System.out.println("郵箱: "+ ((AuthorDetail) a).email()); System.out.println("分機(jī): "+ ((AuthorDetail) a).callExtension()); } System.out.println("--------------"); metadata.demo(); } catch (Exception e) { e.printStackTrace(); } } } |
輸出:
作者: Liang.xf 郵箱: javayou@ 分機(jī): 351 -------------- MetadataDemo方法調(diào)用 |
注釋類型的定義:創(chuàng)建一個interface,在interface前加上符號:@ 注釋類型的定義里,使用了@Retention,它是一種對注釋類型的注釋,共有4種預(yù)定義的注釋類型(稱為元注釋),分別為Retention、Target、Documented和Inherited,它們的含義如下:
1)Target 定義允許何種程序元素可以具有此處定義的注釋類型,它的值引用了ElementType的枚舉類型,ElementType:
package java.lang.annotation; public enum ElementType { TYPE, // Class, interface, or enum (but not annotation) FIELD, // Field (including enumerated values) METHOD, // Method (does not include constructors) PARAMETER, // Method parameter CONSTRUCTOR, // Constructor LOCAL_VARIABLE, // Local variable or catch clause ANNOTATION_TYPE, // Annotation Types (meta-annotations) PACKAGE // Java package } |
2)Retention 定義注釋類型的保存方式,值引用了枚舉類型RetentionPolicy的值,
package java.lang.annotation; public enum RetentionPolicy { SOURCE, // Annotation is discarded by the compiler CLASS, // Annotation is stored in the class file, but ignored by the VM RUNTIME // Annotation is stored in the class file and read by the VM } |
3)Documented: Documented 表示注釋應(yīng)該出現(xiàn)在類的Javadoc中,而默認(rèn)情況下,注釋不包括在 Javadoc 中。
4)Inherited: 表示定義的注釋類型將具備繼承屬性,使用該注釋類型的類被繼承時,其子類仍具備父類的注釋。
元數(shù)據(jù)比較復(fù)雜,而且應(yīng)用面比較廣,在實(shí)際開發(fā)和應(yīng)用中摸索和引入是最好的,這里沒有舉出實(shí)際應(yīng)用案例,只是介紹了其簡單的用法,具體的案例在以后的實(shí)際應(yīng)用經(jīng)驗(yàn)中給予提供。
|