我已经完成了以下教程:
http://www.javaworld.com/community/node/2915
在阅读完上述文章后,我觉得,这是不可能的 写一个Marker接口,因为,你怎么能指示编译器,那个,什么标签, 它嵌入了Marker界面的.class文件中。
如果我错了,请纠正我。 干杯:)
答案 0 :(得分:14)
此处标记是六进制十进制代码AC ED,它被添加到实现Serializable接口的该类的.class文件中。因此,JVM以特殊方式处理此类文件(可能是一些繁重的资源分配工作),因为此类的实例可能是序列化的。对于普通类,它会添加CA FE hex。
啊哈!!我理解你的困惑。
CA FE
字节码文件的幻数;即编译类时获得的文件。 ANY类的字节码文件具有这个神奇的数字,无论它是可序列化的还是不可序列化的。
AC ED
是序列化Java对象文件的神奇数字;即您序列化某个可序列化类的实例的文件。
您正在混合两个不同的概念(类和实例)及其各自的表示。
所以问题的答案是......当然你可以编写自己的标记界面!关于实现标记接口的类,编译器没有什么特别之处。
但是, 无法在纯Java中复制Java对象反序列化的实现。对象反序列化使用后门(Unsafe.allocateInstance
方法)来创建对象而不调用其构造函数。 AFAIK,此方法无法从普通Java代码调用。 (即使它可以,它也不应该......)
答案 1 :(得分:8)
当然你可以写一个标记界面。标记接口通常只是一个完全没有方法的接口(所以任何类都可以实现它)。
你似乎认为标记界面有一些神奇的属性,可以自己做一些事情。事实并非如此。相反,某些其他代码可以对某个对象上的标记接口的存在作出反应,并在类实现它时采取不同的行为。但标记界面本身没有做任何事情。
答案 2 :(得分:3)
package com.example;
interface MarkerInterface {}
这里有一个。只需将其复制到com/example/MarkerInterface.java
,编译并使用它即可!
这是一个用法示例:
class SomeClass implements MarkerInterface {
// ...
}
答案 3 :(得分:2)
您无法创建对JVM有意义的标记接口,如java.io.Serializable
接口所做的那样。但是,您可以使用instanceof
创建一个您在自己的代码中检查的标记界面。
然而,由于我们现在annotations,因此以这种方式使用标记界面通常是不鼓励的。以各种方式标记类方法和字段,以便在编译时使用Annotation Processing Tool (apt)或在运行时使用反射进行后续处理,这是为其创建的注释。
所以不是创建一个标记界面而是像这样使用它:
class MyClass implements MyMarkerInterface {
}
你应该创建一个注释并像这样使用它:
@MyAnnotation
class MyClass {
}
答案 4 :(得分:0)
取决于您对Marker界面的理解。但一般情况下,您可以在代码中使用instanceof
来检查实例是否实现了Marker接口,然后对此实例执行某些操作...