Java註釋被用來爲java代碼提供元數據(meta data)。作爲元數據,註釋不會直接影響代碼的執行結果,不過事實上有些註釋就是爲了影響代碼的執行結果而定義的。
Java註釋是從Java 5開始添加的。本文對於Java註釋的討論是基於java 6的,據我所知,到目前爲止Java 7中關於註釋的部分並沒有發生改變,所以本文對java 7編程人員上來說應該也是可用的。
目錄:
· Java 註釋的作用
· 註釋的基礎知識
· 註釋的位置
· Java中預置的註釋
· 創建你自己的註釋
Java 註釋的作用
預編譯指令(Compiler instructions)
編譯時指令(Build-time instructions)
運行時指令(Runtime instructions)
Java有三個編譯註釋,你可以使用它們來給編譯器發送指令。這些註釋會在稍後再做更詳細的介紹。
Java註釋可以在編譯時(build-time)時使用,當你編譯你的工程時。編譯過程包括生成源代碼,編譯資源文件,生成XML文件(如:部署表述文件),以及將編譯好的代碼或文件打包成一個jar文件等。編譯過程通常是由諸如Apache Ant或Apache Maven之類的編譯工具自動完成的。編譯工具會瀏覽你代碼中的特定註釋,並基於這些註釋生成源代碼或其他文件。
通常情況下,Java註釋在代碼編譯完成後就變得不可見了。但是存在這種可能,你可以定義自己的註釋,並使它們在運行時仍然可見。之後可以通過反射機制來訪問這些註釋來影響你的程序。
註釋的基本知識
註釋的最簡單形式如下:
- @Entity
註釋的元素
一個註釋可以包含多個可以被賦值的元素。一個元素就像是一個屬性或者參數。下面是一個包含一個元素的註釋
- @Entity(tableName = "vehicles")
- @InsertNew("yes")
註釋的位置
你可以將註釋放置到類、接口、方法、方法參數、成員變量、局部變量之前。下面是一個將註釋放到類之前的例子:
- @Entity
- public class Vehicle {
- }
- @Entity
- public class Vehicle {
- @Persistent
- protected String vehicleName = null;
- @Getter
- public String getVehicleName() {
- return this.vehicleName;
- }
- public void setVehicleName(@Optional vehicleName) {
- this.vehicleName = vehicleName;
- }
- public List addVehicleNameToList(List names) {
- @Optional
- List localNames = names;
- if(localNames == null) {
- localNames = new ArrayList();
- }
- localNames.add(getVehicleName());
- return localNames;
- }
- }
Java預置的編譯註釋
Java支持三個可以用來給編譯相關的註釋,它們是:
· @Deprecated
· @Override
· @SuppressWarings
下面將對它們此次做解釋
@Deprecated
@Deprecated用來標記一個類、方法、成員變量已經被捨棄了。如果你的代碼中使用捨棄(Deprecated)的類、方法或成員變量,那麼編譯器會給你一個警告。下面是一個例子:
- @Deprecated
- public class MyComponent {
- }
@Override
@Override被用在方法前,用來說明覆蓋了父類中的方法。假如一個方法被@Override修飾,但實際上它並沒有覆蓋任何方法,則編譯器會提示一個錯誤。
@Override並不是必須的,即覆蓋父類方法時,也可以不在子類方法前面添加@Override。但是還是推薦使用@Override,因爲這樣做是有好處的,至少可以較少一些不必要的錯誤。如覆蓋方法的方法名不對,並沒有實現覆蓋;或者有人修改了父類中的方法名,導致的子類中的覆蓋失效,如果有@Override,編譯器就會自動提示錯誤,從而避免了錯誤。
@SuppressWarnings
使用@SuppressWarnings能夠是編譯器對指定的方法放棄提示警告。如方法中引用了已經被捨棄(@Deprecated修飾)的方法時。
創建你自己的註釋
創建自己的註釋是有可能的。註釋被定義在它們自己的文件中,就像Java中的類或接口一樣。下面是一個例子:
- @interface MyAnnotation {
- String value();
- String name();
- int age();
- String[] newNames();
- }
注意,每個元素的定義都很像接口中的方法定義。你可以使用原始數據類型定義元素的數據類型,你也可以使用數組定義元素的數據類型。但是不能使用複合對象(Complex Object定義元素的數據類型。
要使用上面自定義的註釋,可以這樣做:
- @MyAnnotation(
- value="123",
- name="Jakob",
- age=37,
- newNames={"Jenkov", "Peterson"}
- )
- public class MyClass {
- }
元素的默認值
你可以爲一個元素指定默認值(有點像C++中的方法哈)。這樣在註釋初始化時那個元素就可以忽略了。如下定義了一個包含默認值的註釋
- @interface MyAnnotation {
- String value() default "";
- String name();
- int age();
- String[] newNames();
- }
- @MyAnnotation(
- name="Jakob",
- age=37,
- newNames={"Jenkov", "Peterson"}
- )
- public class MyClass {
- }
@Retention
你可以指定你自定義的註釋在運行時可用,通過反射檢測。要實現這樣的效果,你需要用@Retention修飾你自定義的註釋,如下:
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- @Retention(RetentionPolicy.RUNTIME)
- @interface MyAnnotation {
- String value() default "";
- }
RetentionPolicy還包含了其他兩個值:
RetentionPolicy.CLASS:意味着該註釋需要被保存在.class文件中,但是在運行時是不可用的。這是retention默認的值。
RetentionPolicy.SOURCE:意味着該註釋只在源代碼中可用,而不是在.class文件,也不是在運行時。
@Target
你可以指定那些Java元素(類、方法等)可以使用你自定義的註釋。可以在定義你的Annotaion添加@Target來實現。如下:
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Target;
- @Target({ElementType.METHOD})
- public @interface MyAnnotation {
- String value();
- }
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
上面大多數數值都是可以見文知意的,其中ANNOTATION_TYPE表示只能用來註釋註釋類型(Annotation),就像@Target和@Retention一樣。
@Inherited
@Inherited表明,一個子類實現了繼承了父類中的註釋,如下:
- java.lang.annotation.Inherited
- @Inherited
- public @interface MyAnnotation {
- }
- @MyAnnotation
- public class MySuperClass { ... }
- public class MySubClass extends MySuperClass { ... }
在這個例子中,MySubClass繼承了父類MySuperClass中的@MyAnnotation註釋。
@Documented
@Documented用來表明你自定義的註釋需要在JavaDoc中可見。如下:
- java.lang.annotation.Documented
- @Documented
- public @interface MyAnnotation {
- }
- @MyAnnotation
- public class MySuperClass { ... }
當你生成MySupperClass類的JavaDoc文檔時,@MyAnnotation註釋會出現在JavaDoc文檔中。
這次不是"O啦~~~",而是
哇偶~~~,終於結束了!!!
轉帖請保留出處:http://blog.csdn.net/u011638883/article/details/13168799
謝謝!!