Domanda

Ho passato con il seguente tutorial:

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

E dopo aver letto l'articolo di cui sopra, ritengo, che non è possibile scrivere un interfaccia Marker, perché, come si può istruire il compilatore, che, cosa tag, si incorporare nel file .class per l'interfaccia Marker.

Si prega di correggere me, se mi sbaglio. acclamazioni:)

È stato utile?

Soluzione

  

qui tag è un codice hexa decimale AC DE, che viene aggiunto al file .class di quella classe che implementa l'interfaccia Serializable. Quindi, che JVM considera questo file di classe in modo speciale (può essere un po 'pesante risorsa lavoro di assegnazione), perché un'istanza di questa classe potrebbe essere serializzato. Per le classi normali, aggiunge CA FE hex.

Ah !! Capisco la vostra confusione.

  • CA FE il numero magico per un file bytecode; vale a dire il file che si ottiene quando si compila una classe. Il file bytecode per qualsiasi classe ha questo numero magico, se è serializzabile o no serializzabile.

  • AC ED è il numero magico di un file oggetto Java serializzato; vale a dire il file si serializza un'istanza di una classe serializzabile.

si stia mescolando due concetti diversi (classi e istanze) e le loro rispettive rappresentazioni.

Quindi la risposta alla tua domanda è ... naturalmente è possibile scrivere i propri interfacce marcatori! Non c'è niente di speciale per il compilatore di una classe che implementa un'interfaccia marcatore.

Tuttavia, dovrebbe essere impossibile da duplicare l'implementazione di Java oggetto deserializzazione in puro Java. Oggetto deserializzazione utilizza una backdoor (il metodo Unsafe.allocateInstance) per creare oggetti senza invocare i loro costruttori. Per quanto ne so, questo metodo non può essere chiamato da normale codice Java. (E anche se può, non dovrebbe essere ...)

Altri suggerimenti

Naturalmente è possibile scrivere un'interfaccia marcatore. Un'interfaccia marcatore è generalmente solo un'interfaccia con nessun metodo a tutti (quindi ogni classe potrebbe attuarlo).

È sembrano pensare che le interfacce marcatori hanno alcune proprietà magiche che fanno qualcosa per conto proprio. Questo non è il caso. Invece alcuni altro di codice in grado di reagire alla presenza dell'interfaccia marcatore su qualche oggetto e agire in modo diverso quando una classe implementa. Ma l'interfaccia marcatore stesso non fa nulla .

package com.example;
interface MarkerInterface {}

Qui ne hai uno. Basta CopyPaste in com/example/MarkerInterface.java, compilare ed usarlo!

Ecco un esempio di utilizzo:

class SomeClass implements MarkerInterface {
    // ...
}

Non è possibile creare un'interfaccia marcatore che avrà un senso al JVM, come l'interfaccia java.io.Serializable fa. Tuttavia è possibile creare un'interfaccia marcatore che si controlla nel proprio codice utilizzando instanceof.

Tuttavia utilizzando interfacce marcatore in questo modo è generalmente scoraggiano ora che abbiamo annotazioni . Marcatura metodi di classe e campi in vari modi per la successiva elaborazione in fase di compilazione utilizzando il Annotazione di elaborazione dello strumento (apt) o in fase di esecuzione utilizzando la riflessione è quello che le annotazioni sono stati creati per.

Quindi, piuttosto che la creazione di un'interfaccia marcatore e usarlo in questo modo:

class MyClass implements MyMarkerInterface {
}

Probabilmente si dovrebbe creare un'annotazione e usarlo in questo modo:

@MyAnnotation
class MyClass {
}

Dipende da cosa si capisce come interfaccia Marker. Ma in generale, è possibile utilizzare instanceof nel codice per verificare se un'istanza implementa un'interfaccia Marker e poi fare qualcosa con questo esempio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top