我已经完成了以下教程:

http://www.javaworld.com/community/node/2915

我觉得,在阅读了上面的文章之后,无法编写标记接口,因为,您如何指示编译器,该标签,它嵌入了标记接口的.class文件中。

如果我错了,请纠正我。干杯:)

有帮助吗?

解决方案

这里的标签是十六进制代码AC ED,它被添加到实现Serialized接口的类的.class文件中。因此,JVM 以特殊方式处理此类文件(可能是一些繁重的资源分配工作),因为此类的实例可能会被序列化。对于普通类别,它添加 CA FE 十六进制。

啊哈!!我理解你的困惑。

  • CA FE 字节码文件的幻数;IE。编译类时获得的文件。任何类的字节码文件都有这个幻数,无论它是可序列化还是不可序列化。

  • AC ED 是序列化 Java 对象文件的幻数;IE。您序列化某个可序列化类的实例的文件。

您混淆了两个不同的概念(类和实例)及其各自的表示。

所以你的问题的答案是......当然,您可以编写自己的标记接口!对于实现标记接口的类来说,编译器没有什么特别的。

然而,它 不可能在纯Java中重复Java对象反序列化的实现。对象反序列化使用后门( Unsafe.allocateInstance 方法)来创建对象而不调用其构造函数。AFAIK,这个方法不能从普通的 Java 代码中调用。(即使可以,也不应该……)

其他提示

当然,你可以写一个标记接口。的标记接口通常仅仅是一个完全没有方法接口(因此,任何类可以实现的话)。

您似乎认为标记接口有一些神奇的特性是自己做的东西。这是不是这样的。代替一些其他代码可以在一些物体上的标记接口的存在下反应而采取不同的当一个类实现它。但是标记接口本身的不会做任何事情

package com.example;
interface MarkerInterface {}

在这里,你有一个。只是copypaste成com/example/MarkerInterface.java,编译和使用它!

下面是一个使用示例:

class SomeClass implements MarkerInterface {
    // ...
}

您无法创建对 JVM 有意义的标记接口,例如 java.io.Serializable 接口确实如此。但是,您可以创建一个标记接口,您可以使用以下命令在自己的代码中检查该接口 instanceof.

然而,现在我们通常不鼓励以这种方式使用标记接口 注释. 。以各种方式标记类方法和字段,以便稍后在编译时使用 注释处理工具(apt) 或者在运行时使用反射是创建注释的目的。

因此,不要创建一个标记接口并像这样使用它:

class MyClass implements MyMarkerInterface {
}

您可能应该创建一个注释并像这样使用它:

@MyAnnotation
class MyClass {
}

取决于你明白作为一个标记接口。但在一般情况下,你可以使用instanceof在你的代码检查,如果一个实例实现了一个标记接口,然后做一些与此实例...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top