在Java中,註解(Annotation)引入始於Java5,用來描述Java代碼的元信息,通常情況下註解不會直接影響代碼的執行,儘管有些註解可以用來做到影響代碼執行。
註解可以做什麼
Java中的註解通常扮演以下角色
其中
註解基礎
一個簡單的Java註解類似與@Entity。其中@的意思是告訴編譯器這是一個註解。而Entity則是註解的名字。通常在文件中,寫法如下
public @interface Entity {
}
註解元素
Java註解可以使用元素來進行設置一些值,註解中的元素類似於屬性或者參數。定義包含元素的註解示例代碼
public @interface Entity {
String tableName();
}
使用包含元素的註解示例代碼
@Entity(tableName = "vehicles")
上述註解的元素名稱為tableName,設置的值為vehicles。沒有元素的註解不需要使用括號。
如果註解包含多個元素,使用方法如下
@Entity(tableName = "vehicles", primaryKey = "id")
如果註解只有一個元素,通常我們的寫法是這樣的
@InsertNew(value = "yes")
但是這種情況下,當且僅當元素名為value,我們也可以簡寫,即不需要填寫元素名value,效果如下
@InsertNew("yes")
註解使用
註解可以用來修飾代碼中的這些元素
一個完整的使用示例如下
@Entitypublic 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
可以用來標記類,方法,屬性。
如果上述三種元素不再使用,使用@Deprecated註解如果代碼使用了@Deprecated註解的類,方法或屬性,編譯器會進行警告。
@Deprecated使用很簡單,如下為註解一個棄用的類。
@Deprecatedpublic class MyComponent {}當我們使用@Deprecated註解後,建議配合使用對應的@deprecated JavaDoc符號,並解釋說明為什麼這個類,方法或屬性被棄用,已經替代方案是什麼。
@Deprecated/** @deprecated This class is full of bugs. Use MyNewComponent instead.*/public class MyComponent {}@Override
@Override註解用來修飾對父類進行重寫的方法。如果一個並非重寫父類的方法使用這個註解,編譯器將提示錯誤。
實際上在子類中重寫父類或接口的方法,@Overide並不是必須的。但是還是建議使用這個註解,在某些情況下,假設你修改了父類的方法的名字,那麼之前重寫的子類方法將不再屬於重寫,如果沒有@Overide,你將不會察覺到這個子類的方法。有了這個註解修飾,編譯器則會提示你這些信息。
使用Override註解的例子
public class MySuperClass { public void doTheThing() { System.out.println("Do the thing"); }}public class MySubClass extends MySuperClass{ @Override public void doTheThing() { System.out.println("Do it differently"); }}@SuppressWarnings
@SuppressWarnings用來抑制編譯器生成警告信息。
可以修飾的元素為類,方法,方法參數,屬性,局部變量
使用場景:當我們一個方法調用了棄用的方法或者進行不安全的類型轉換,編譯器會生成警告。我們可以為這個方法增加
@SuppressWarnings註解,來抑制編譯器生成警告。
注意:使用@SuppressWarnings註解,採用就近原則,比如一個方法出現警告,我們盡量使用@SuppressWarnings註解這個方法,而不是註解方法所在的類。雖然兩個都能抑制編譯器生成警告,但是范圍越小越好,因為範圍大了,不利於我們發現該類下其他方法的警告信息。
使用示例
@SuppressWarningspublic void methodWithWarning() {}創建自己的註解
在Java中,我們可以創建自己的註解,註解和類,接口文件一樣定義在自己的文件裡面。如下
@interface MyAnnotation { String value(); String name(); int age(); String[] newNames();}上述代碼定義了一個叫做MyAnnotation的註解,它有4個元素。再次強調一下,@interface這個關鍵字用來告訴java編譯器這是一個註解。
仔細一看,你會發現,註解元素的定義很類似於接口的方法。這些元素有類型和名稱。這些類型可以是
如下為應用自定義的註解
@MyAnnotation( value="123", name="Jakob", age=37, newNames={"Jenkov", "Peterson"})public class MyClass {}注意,我們需要為所有的註解元素設置值,一個都不能少。
註解元素默認值
對於註解中的元素,我們可以為其設置默認值,使用方法為
@interface MyAnnotation { String value() default ""; String name(); int age(); String[] newNames();}上述代碼,我們設置了value元素的默認值為空字符串。當我們在使用時,可以不設置value的值,即讓value使用空字符串默認值。 使用示例代碼
@MyAnnotation( name="Jakob", age=37, newNames={"Jenkov", "Peterson"})public class MyClass {}@Retention
@Retention是用來修飾註解的註解,使用這個註解,我們可以做到
控制註解是否寫入class文件控制class文件中的註解是否在運行時可見
控制很簡單,使用使用以下三種策略之一即可。
RetentionPolicy.SOURCE 表明註解僅存在源碼之中,不存在.class文件,更不能運行時可見。常見的註解為@Override, @SuppressWarnings。
RetentionPolicy.CLASS 這是默認的註解保留策略。這種策略下,註解將存在與.class文件,但是不能被運行時訪問。通常這種註解策略用來處於一些字節碼級別的操作。
RetentionPolicy.RUNTIME 這種策略下可以被運行時訪問到。通常情況下,我們都會結合反射來做一些事情。
@Retention的使用示例
import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation { String value() default "";}@Target
使用@Target註解,我們可以設定自定義註解可以修飾哪些java元素。簡單示例
import java.lang.annotation.ElementType;import java.lang.annotation.Target;@Target({ElementType.METHOD})public @interface MyAnnotation { String value();}上述的代碼說明MyAnnotation註解只能修飾方法。
@Target可以選擇的參數值有如下這些
@Inherited
如果你想讓一個類和它的子類都包含某個註解,就可以使用@Inherited來修飾這個註解。
java.lang.annotation.Inherited@Inheritedpublic @interface MyAnnotation {}12@MyAnnotationpublic class MySuperClass { ... }1public class MySubClass extends MySuperClass { ... }上述代碼的大致意思是
1.使用@Inherited修飾註解MyAnnotation
2.使用MyAnnotation註解MySuperClass
3.實現一個類MySubclass繼承自MySuperClass
通過以上幾步,MySubClass也擁有了MyAnnotation註解。
關於Java中的註解,一些基本的概念就是這些。
以上就是關於Java 中的註解資料整理,後續繼續補充相關資料,謝謝大家對本站的支持!