一、标记接口
一些容器例如Ejb容器,servlet容器或运行时环境依赖标记接口识别类是否需要进行某种处理,比如serialialbe接口标记类需要进行序列化操作.
未实现此接口的类将无法使其任何状态序列化或反序列化.为保证serialVersionUID 值跨不同java编译器实现的一致性,序列化类必须声明一个明确的serialVersionUID 值.
表明Object.clone()方法可以合法地对该类实例进行按字段复制.实现此接口的类应该使用公共方法重写Object.clone(它是受保护的).如果在没有实现Cloneable 接口的实例上调用Object 的clone 方法,则会导致抛出CloneNotSupportedExcepti
用来表明其支持快速(通常是固定时间)随机访问.此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能.
Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口.任何远程对象都必须直接或间接实现此接口.只有在“远程接口”(扩展java.rmi.Remote 的接口)中指定的这些方法才可远程使用.
二、标记注解
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
提供空的圆括号虽然不是错误,但不是必需的。