Java中的標記介面和標記註解
一、標記介面
標識介面是沒有任何方法和屬性的介面.它僅僅表明它的類屬於一個特定的型別,供其他程式碼來測試允許做一些事情.使用標記介面的唯一目的是使得可以用instanceof進行型別查詢,例如:
if(obj instanceof Cloneable) {………}
一些容器例如Ejb容器,servlet容器或執行時環境依賴標記介面識別類是否需要進行某種處理,比如serialialbe介面標記類需要進行序列化操作.
java.io.Serializable
未實現此介面的類將無法使其任何狀態序列化或反序列化.為保證serialVersionUID
java.lang.Cloneable
表明Object.clone()方法可以合法地對該類例項進行按欄位複製.實現此介面的類應該使用公共方法重寫Object.clone(它是受保護的).如果在沒有實現Cloneable 介面的例項上呼叫Object 的clone 方法,則會導致丟擲CloneNotSupportedException 異常.
java.util.RandomAccess
用來表明其支援快速(通常是固定時間)隨機訪問.此介面的主要目的是允許一般的演算法更改其行為
java.rmi.Remote
Remote 介面用於標識其方法可以從非本地虛擬機器上呼叫的介面.任何遠端物件都必須直接或間接實現此介面.只有在“遠端介面”(擴充套件java.rmi.Remote 的介面)中指定的這些方法才可遠端使用.
二、標記註解
標記註解是特殊型別的註解,其中不包含成員。標記註解的唯一目的就是標記宣告,因此,這種註解作為註解而存在的理由是充分的。確定標記註解是否存在的最好方式是使用isAnnotationPresent()方法,該方法是由AnnotatedElement介面定義的。
下面是一個使用標記註解的例子。因為標記註解不包含成員,所以只需要簡單地判斷其是否存在即可。
import java.lang.annotation.*;
import java.lang.reflect.*;
// A marker annotation.
@Retention(RetentionPolicy.RUNTIME)
@interface MyMarker { }
class Marker {
// Annotate a method using a marker.
// Notice that no ( ) is needed.
@MyMarker
public static void myMeth() {
Marker ob = new Marker();
try {
Method m = ob.getClass().getMethod("myMeth");
// Determine if the annotation is present.
if(m.isAnnotationPresent(MyMarker.class))
System.out.println("MyMarker is present.");
} catch (NoSuchMethodException exc) {
System.out.println("Method Not Found.");
}
}
public static void main(String args[]) {
myMeth();
}
}
輸出如下所示,@MyMarker確實是存在的:
MyMarker is present.
在這個程式中,應用@MyMarker時後面不需要有圓括號。因此,只通過名稱即可應用@MyMarker,如下所示:
@MyMarker
提供空的圓括號雖然不是錯誤,但不是必需的。