Frage

Ich habe durch das folgende Tutorial gegangen:

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

Und nach dem oben genannten Artikel zu lesen, ich fühle, dass es nicht möglich ist, schreib eine Marker-Schnittstelle, weil, wie können Sie anweisen, Compiler, dass, was für Tag, es einbetten in der .class-Datei für Ihre Marker-Schnittstelle.

Bitte korrigieren Sie mich, wenn ich falsch bin. prost:)

War es hilfreich?

Lösung

  

hier Tag ist Hexadezimal-Code AC ED, die auf die .class-Datei dieser Klasse, die implementiert Serializable Schnittstelle hinzugefügt wird. So, das JVM behandelt diese Klassendatei in besonderer Weise (kann einige schwere Ressourcenzuweisung Arbeit sein), da Instanz dieser Klasse könnte serialisiert werden. Für den normalen Klassen, fügt es CA FE hex.

Aha !! Ich verstehe Ihre Verwirrung.

  • CA FE die magische Zahl für eine Bytecode-Datei; das heißt, die Datei erhalten Sie, wenn Sie eine Klasse kompilieren. Die Bytecode-Datei für jede Klasse, hat diese magische Zahl, ob es serializable oder nicht serialisierbar ist.

  • AC ED ist die magische Zahl eine serialisierte Java-Objekt-Datei; das heißt, die Datei, die Sie eine Instanz einer serialisierbaren Klasse serialisiert werden.

Sie sind Vertauschen zwei verschiedene Konzepte (Klassen und Instanzen) sowie ihre jeweiligen Darstellungen.

Also die Antwort auf Ihre Frage ist ... natürlich können Sie Ihre eigenen Marker-Schnittstellen schreiben! Es ist nichts Besonderes an den Compiler um eine Klasse, die implementiert eine Markierungsschnittstelle.

Es ist jedoch würde unmöglich sein, die Umsetzung von Java-Objekt Deserialisierung in reinem Java zu duplizieren. Objekt Deserialisierung verwendet eine Hintertür (die Unsafe.allocateInstance-Methode), um Objekte zu erstellen, ohne ihre Konstruktoren aufrufen. AFAIK, kann dieses Verfahren nicht von normalen Java-Code aufgerufen werden. (Und selbst wenn es kann, sollte es nicht sein ...)

Andere Tipps

Natürlich können Sie eine Marker-Schnittstelle schreiben. Eine Marker-Schnittstelle ist in der Regel nur eine Schnittstelle ohne Methoden überhaupt (so dass jede Klasse sie umsetzen könnte).

Sie scheinen zu glauben, dass Marker-Schnittstellen einige magische Eigenschaften haben, die auf eigene Faust etwas unternehmen. Das ist nicht der Fall. Stattdessen einige andere Code kann auf einem Objekt auf das Vorhandensein der Marker-Schnittstelle reagieren und anders handeln, wenn eine Klasse implementiert sie. Aber die Marker-Interface selbst nichts tun .

package com.example;
interface MarkerInterface {}

Hier haben Sie ein. Copypaste es einfach in com/example/MarkerInterface.java, Kompilierung und verwenden Sie es!

Hier ist ein Anwendungsbeispiel:

class SomeClass implements MarkerInterface {
    // ...
}

Sie können keine Marker-Schnittstelle erstellen, die auf der JVM Bedeutung haben wird, wie die java.io.Serializable Schnittstelle tut. Allerdings könnten Sie eine Markierungsschnittstelle erstellen, dass Sie in Ihrem eigenen Code überprüfen instanceof verwenden.

Allerdings Marker mit Hilfe von Schnittstellen auf diese Weise im Allgemeinen ist entmutigt jetzt, dass wir Anmerkungen . Kennzeichnung Klasse Methoden und Felder auf verschiedene Weise für die spätere Verarbeitung bei der Kompilierung mit dem Anmerkung Verarbeitungswerkzeug (apt) oder zur Laufzeit mithilfe von Reflektion ist das, was Anmerkungen für erstellt wurden.

Also anstatt eine Markierungsschnittstelle Erstellen und Verwenden sie etwa so:

class MyClass implements MyMarkerInterface {
}

Sie sollten wahrscheinlich eine Anmerkung erstellen und verwenden Sie es wie folgt:

@MyAnnotation
class MyClass {
}

Abhängig von, was Sie als Marker-Schnittstelle zu verstehen. Aber im Allgemeinen Sie instanceof in Ihrem Code verwenden können, wenn eine Instanz implementiert eine Marker-Schnittstelle zu überprüfen und dann etwas mit diesem Fall ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top