Question

Je suis passé par le tutoriel suivant:

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

Et après avoir lu l'article ci-dessus, je me sens, qu'il est impossible de écrire une interface de marqueur, parce que, comment pouvez-vous demander compilateur, que, quelle étiquette, il intégrer dans le fichier .class pour votre interface marqueur.

S'il vous plaît me corriger si je me trompe. acclamations:)

Était-ce utile?

La solution

  

ici balise est le code décimal hexa ED AC, qui est ajouté au fichier .class de cette classe qui implémente l'interface Serializable. Alors, que JVM traite ce fichier de classe d'une manière particulière (peut-être un travail d'allocation des ressources lourde), parce que par exemple de cette classe peut être sérialisée. Pour les classes normales, il ajoute hex CA FE.

Aha !! Je comprends votre confusion.

  • CA FE le numéro magique pour un fichier bytecode; à savoir le fichier que vous obtenez lorsque vous compilez une classe. Le fichier bytecode pour toute classe a ce nombre magique, que ce soit sérialisable ou non sérialisable.

  • AC ED est le nombre magique d'un fichier objet Java sérialisé; à savoir le fichier que vous sérialisez une instance d'une classe sérialisable.

Vous confondez deux concepts différents (classes et instances) et leurs représentations respectives.

Donc, la réponse à votre question est ... Bien sûr, vous pouvez écrire vos propres interfaces marqueurs! Il n'y a rien de spécial au compilateur sur une classe qui implémente une interface marqueur.

Cependant, serait impossible de dupliquer la mise en œuvre de l'objet Java désérialisation en Java. désérialisation objet utilise une porte dérobée (la méthode de Unsafe.allocateInstance) pour créer des objets sans invoquer leurs constructeurs. Autant que je sache, cette méthode ne peut pas être appelé à partir du code Java normal. (Et même si elle peut, il ne doit pas être ...)

Autres conseils

Bien sûr, vous pouvez écrire une interface de marqueur. Une interface marqueur est généralement juste une interface avec aucune méthode du tout (de sorte que toute la classe pourrait mettre en œuvre).

Vous semblez penser que les interfaces marqueurs ont des propriétés magiques qui font quelque chose de leur propre chef. Ce n'est pas le cas. Au lieu de cela une autre code peut réagir sur la présence de l'interface marqueur sur un objet et agir différemment quand une classe implémente. Mais l'interface elle-même marqueur ne fait rien .

package com.example;
interface MarkerInterface {}

Vous en avez un. Juste copypaste dans com/example/MarkerInterface.java, compiler et utiliser!

Voici un exemple d'utilisation:

class SomeClass implements MarkerInterface {
    // ...
}

Vous ne pouvez pas créer une interface de marqueur qui aura un sens à la machine virtuelle Java, comme l'interface java.io.Serializable fait. Cependant, vous pouvez créer une interface de marqueur que vous vérifiez dans votre propre code à l'aide instanceof.

Cependant, l'utilisation des interfaces marqueurs de cette manière est généralement découragent maintenant que nous avons annotations . Marquage des méthodes de classe et les champs de différentes manières pour un traitement ultérieur au moment de la compilation en utilisant le outil d'annotation traitement (apt) ou lors de l'exécution en utilisant la réflexion est ce que les annotations ont été créées pour.

Alors plutôt que de créer une interface de marqueur et de l'utiliser comme ceci:

class MyClass implements MyMarkerInterface {
}

Vous devriez probablement créer une annotation et de l'utiliser comme ceci:

@MyAnnotation
class MyClass {
}

Cela dépend de ce que vous entendez comme une interface de marqueur. Mais en général, vous pouvez utiliser instanceof dans votre code pour vérifier si une instance implémente une interface de marqueur, puis faire quelque chose avec cette instance ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top