Ist es möglich, eine Marker-Schnittstelle zu schreiben?

8

Ich habe das folgende Tutorial durchgegangen:

Ссылка

Und nachdem ich den obigen Artikel gelesen habe, fühle ich, dass es nicht möglich ist Schreiben Sie eine Marker-Schnittstelle, denn, wie können Sie Compiler, das, was Tag, Es wird in die .class-Datei für Ihre Marker-Schnittstelle eingebettet.

Bitte korrigieren Sie mich, wenn ich falsch liege. Prost:)

    
mogli 27.01.2010, 12:03
quelle

5 Antworten

14
  

here-Tag ist Hexadezimalcode AC ED, der zur .class-Datei dieser Klasse hinzugefügt wird, die die Serializable-Schnittstelle implementiert. Daher behandelt JVM diese Klassendatei auf eine spezielle Art und Weise (möglicherweise ist dies eine große Ressourcenzuweisungsarbeit), da die Instanz dieser Klasse serialisiert sein kann. Für normale Klassen wird CA FE hex hinzugefügt.

Aha !! Ich verstehe deine Verwirrung.

  • CA FE die magische Zahl für eine Bytecode-Datei; d. h. die Datei, die Sie beim Kompilieren einer Klasse erhalten. Die Bytecode-Datei für jede Klasse hat diese magische Zahl, unabhängig davon, ob sie serialisierbar oder nicht serialisierbar ist.

  • AC ED ist die magische Zahl einer serialisierten Java-Objektdatei; d. h. die Datei, in der Sie eine Instanz einer serialisierbaren Klasse serialisieren.

Sie vermischen zwei verschiedene Konzepte (Klassen und Instanzen) und ihre jeweiligen Repräsentationen.

Die Antwort auf Ihre Frage lautet also ... natürlich können Sie eigene Marker-Interfaces schreiben! Es gibt nichts Besonderes für den Compiler über eine Klasse, die eine Marker-Schnittstelle implementiert.

Es wäre jedoch unmöglich, die Implementierung der Java-Objektdeserialisierung in reinem Java zu duplizieren. Die Deserialisierung von Objekten verwendet eine Backdoor (die Methode Unsafe.allocateInstance ), um Objekte zu erstellen, ohne deren Konstruktoren aufzurufen. AFAIK, diese Methode kann nicht aus normalem Java-Code aufgerufen werden. (Und selbst wenn es möglich ist, sollte es nicht sein ...)

    
Stephen C 27.01.2010, 12:52
quelle
8

Natürlich können Sie eine Marker-Schnittstelle schreiben. Eine Marker-Schnittstelle ist im Allgemeinen nur eine Schnittstelle ohne Methoden (also könnte jede Klasse sie implementieren).

Sie scheinen zu denken, dass Marker-Interfaces einige magische Eigenschaften haben, die selbst etwas bewirken. Das ist nicht der Fall. Stattdessen kann ein anderer Code auf das Vorhandensein der Marker-Schnittstelle auf einem Objekt reagieren und anders handeln, wenn eine Klasse ihn implementiert. Aber die Marker-Schnittstelle selbst macht nichts .

    
Joachim Sauer 27.01.2010 12:07
quelle
3
%Vor%

Hier haben Sie eins. Kopieren Sie es einfach in com/example/MarkerInterface.java , kompilieren und verwenden Sie es!

Hier ist ein Anwendungsbeispiel:

%Vor%     
BalusC 27.01.2010 12:11
quelle
2

Sie können keine Markierungsschnittstelle erstellen, die eine Bedeutung für die JVM hat, wie die Schnittstelle java.io.Serializable . Sie könnten jedoch eine Marker-Schnittstelle erstellen, nach der Sie mit instanceof in Ihrem eigenen Code suchen.

Die Verwendung von Marker-Interfaces auf diese Weise wird jedoch im Allgemeinen davon abgeraten, dass wir Annotationen haben . Klassenmethoden und -felder auf verschiedene Arten für die spätere Verarbeitung zur Kompilierungszeit markieren, indem die Annotationsverarbeitung verwendet wird Werkzeug (apt) oder zur Laufzeit unter Verwendung von Reflektion sind die, für die Anmerkungen erstellt wurden.

Also anstatt eine Marker-Schnittstelle zu erstellen und sie so zu benutzen:

%Vor%

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

%Vor%     
Tendayi Mawushe 27.01.2010 12:52
quelle
0

Hängt davon ab, was Sie als Marker-Schnittstelle verstehen. Im Allgemeinen können Sie instanceof in Ihrem Code verwenden, um zu überprüfen, ob eine Instanz eine Marker-Schnittstelle implementiert und dann etwas mit dieser Instanz macht ...

    
Frank Grimm 27.01.2010 12:09
quelle

Tags und Links