如何在Java中编写自己的标记界面?

Sar*_*nan 15 java oop interface

我知道java中的标记界面.它用于定义关于类的特定行为.例如,Serializable接口具有将对象存储到字节流及其反向过程的特定功能.但我不知道这个特定行为的实现位置,因为它没有任何方法.

  1. JVM如何调用此特定行为?
  2. 如何编写我们自己的标记界面?你能给我一个简单的用户定义标记界面供我理解吗?
  3. 是否可以在标记界面中使用方法?

请指导我解决此问题.

mpr*_*hat 29

  • JVM如何调用此特定行为

ObjectOutputStreamObjectInputStream会检查你的班级是否实施Serializable,Externalizable.如果是,它将继续或否则将被抛出NonSerializableException.

  • 如何编写我们自己的标记界面

创建一个没有任何方法的接口,这是您的标记接口.

样品

public interface IMarkerEntity {


}
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序将任何实现此接口的类作为数据库实体.

示例代码:

public boolean save(Object object) throws InvalidEntityException {
   if(!(object instanceof IMarkerEntity)) {
       throw new InvalidEntityException("Invalid Entity Found, cannot proceed");
   } 
   database.save(object);
}
Run Code Online (Sandbox Code Playgroud)
  • 这可能在标记界面中有方法吗?

整个构思标记接口模式是提供一个的意思是说"是的,我的东西",然后系统会使用默认的过程,就像继续当你标记你的类作为Serialzable它只是告诉这个类可以转换为字节.

  • 这必须是答案 (5认同)

Jef*_*rey 14

  1. 序列化由ObjectInputStreamObjectOutputStream类处理.如果类具有特殊的序列化需求,则API中概述了要创建的方法.反射用于调用这些方法.

  2. 与编写任何其他界面的方式相同.

  3. 没有什么可以阻止你将方法放在标记界面中.

现在更常见的做法是使用注释来提供相同的元数据标记接口.

  • @Saravanan JDK是开源的.[`ObjectInputStream`](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source).[`ObjectOutputStream`](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source). (3认同)

Vij*_*att 5

是的我们可以创建我们自己的Marker界面.参见下面的...

interface Marker{   
}

class MyException extends Exception {   
    public MyException(String s){
        super(s);
    }
}

class A  {
    void m1() throws MyException{        
         if((this instanceof Marker)){
             System.out.println("successfull");
         }
         else {
             throw new MyException("Must implement interface Marker ");
         }      
    }   
}

public class CustomMarkerInterfaceExample  extends A implements Marker
{ // if this class will not implement Marker, throw exception
    public static void main(String[] args)  {
        CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample();
        try {
            a.m1();
        } catch (MyException e) {

            System.out.println(e);
        }


    }

}
Run Code Online (Sandbox Code Playgroud)