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