1. 程式人生 > >Java中的標記介面和標記註解

Java中的標記介面和標記註解

一、標記介面

    標識介面是沒有任何方法和屬性的介面.它僅僅表明它的類屬於一個特定的型別,供其他程式碼來測試允許做一些事情.使用標記介面的唯一目的是使得可以用instanceof進行型別查詢,例如:

        if(obj instanceof Cloneable) {………}

一些容器例如Ejb容器,servlet容器或執行時環境依賴標記介面識別類是否需要進行某種處理,比如serialialbe介面標記類需要進行序列化操作.

        java.io.Serializable

未實現此介面的類將無法使其任何狀態序列化或反序列化.為保證serialVersionUID

 值跨不同java編譯器實現的一致性,序列化類必須宣告一個明確的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

提供空的圓括號雖然不是錯誤,但不是必需的。