如何用Java编写我们自己的标记接口?

如何用Java编写我们自己的标记接口?,java,oop,interface,Java,Oop,Interface,我知道java中的标记接口。它用于定义类的特定行为。例如,Serializable接口具有将对象存储到字节流及其反向进程的特定能力。但我不知道这个特定行为在哪里实现,因为它没有任何方法 JVM如何调用这种特定行为 如何编写我们自己的标记接口?你能给我一个简单的用户定义的标记界面让我理解吗 在marker接口中可以有方法吗 请指导我解决这个问题 序列化由ObjectInputStream和ObjectOutputStream类处理。如果类有特殊的序列化需要,则要创建的方法将在中概述。反射用于调用这

我知道java中的标记接口。它用于定义类的特定行为。例如,Serializable接口具有将对象存储到字节流及其反向进程的特定能力。但我不知道这个特定行为在哪里实现,因为它没有任何方法

  • JVM如何调用这种特定行为
  • 如何编写我们自己的标记接口?你能给我一个简单的用户定义的标记界面让我理解吗
  • 在marker接口中可以有方法吗
  • 请指导我解决这个问题

  • 序列化由
    ObjectInputStream
    ObjectOutputStream
    类处理。如果类有特殊的序列化需要,则要创建的方法将在中概述。反射用于调用这些方法

  • 与编写任何其他接口的方式相同

  • 没有什么能阻止您将方法放入标记接口中


  • 现在更常见的做法是使用标记接口提供相同的元数据。

    据我所知,标记接口通过“实用程序”类获得其行为。例如,如果您阅读过四人帮的《设计模式》一书,您就会看到一个类的行为,该类使用另一个类中定义的标记接口进行标记


    例如,您有一个标记接口“Saveable”。您有一个进程,该进程遍历实现该接口的所有类(通过反射),然后对其执行保存操作

    正如Wikipedia文章中很好地解释的,标记接口是元数据的一种形式。客户机代码可以测试对象是否是标记接口的实例,并相应地调整其(客户机)行为。这是一个标记接口:

    public interface CoolObject {
    }
    
    然后,代码可以测试对象是否为
    CoolObject
    ,并对其进行处理:

    if (anObject instanceof CoolObject) {
        addToCoolList((CoolObject) anObject);
    }
    
    Serializable
    接口被定义为Java语言的一部分。您不能自己实现该级别的行为

    您可以将方法添加到标记器接口,但这会将标记模式与接口的其他概念用途混合在一起,可能会造成混淆。(实现接口的类是为了标记它,还是为了它的行为,或者两者兼而有之?)

    正如维基百科文章中所解释的,Java中的标记接口可以(也可能应该)替换为。

    • JVM如何调用此特定行为
    ObjectOutputStream
    ObjectInputStream
    将检查您的类是否实现了
    Serializable
    Externalizable
    。如果是,它将继续,否则将抛出
    NonSerializableException

    • 如何编写我们自己的标记接口
    创建一个没有任何方法的接口,这就是您的标记接口

    样品

    public interface IMarkerEntity {
    
    
    }
    
    如果应用程序将实现此接口的任何类作为数据库实体

    示例代码:

    public boolean save(Object object) throws InvalidEntityException {
       if(!(object instanceof IMarkerEntity)) {
           throw new InvalidEntityException("Invalid Entity Found, cannot proceed");
       } 
       database.save(object);
    }
    
    • 在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);
            }
    
    
        }
    
    }
    

    标记接口没有方法。Java具有内置的标记接口,如
    Serializable
    Clonable
    &
    EventListner
    等,JVM可以理解这些接口

    我们可以创建自己的标记接口,但它与JVM无关,我们可以使用
    instanceOf
    添加一些检查

  • 创建空接口

    interface Marker{    }
    
    class A implements Marker {
        //do some task
    }
    
  • 编写一个类并实现接口

    interface Marker{    }
    
    class A implements Marker {
        //do some task
    }
    
  • Main
    class检查标记接口
    instanceof

    class Main {
        public static void main(String[] args) {
            A ob = new A(){
            if (ob instanceof A) {
                // do some task
            }
        }
    }
    

  • 为什么要编写标记接口?这是一种过时的东西。使用注释。。。。无论如何,你会使用你自己的“marker接口”@Op De Cirkel做什么?它绝对不是过时的,首先也是最重要的,marker接口定义了一个由标记类的实例实现的类型;标记注释不需要。阅读有效java第二版第37项了解更多详细信息:非常感谢…我想知道他们在哪里编写与ObjectInputStream类相关的代码…?然后只有我才能编写自己的标记接口,如serilizable…查看所述类的源代码,而不是询问确切的行@Saravanan JDK是开源的@Jeffrey回答得很好:)但是+1作为注释
    JDK是开源的
    ;):p“现在更常见的做法是使用注释来提供标记接口提供的相同元数据。”-标记接口定义由标记类的实例实现的类型;标记注释不需要。源代码:有效的Java第三版第41项。这必须是答案尼斯的解释:)在编写代码时,您可能需要更加注意,因为第3点的代码有几个错误。