Pregunta

Me han pasado por el siguiente tutorial:

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

Y después de leer el artículo anterior, me siento, que no es posible escribir una interfaz de marcador, porque, ¿cómo se puede instruir compilador, que, lo etiqueta, se incorporan al archivo .class para la interfaz de marcador.

Por favor, corríjanme si estoy equivocado. cheers:)

¿Fue útil?

Solución

  

aquí etiqueta es un código decimal hexa AC ED, que se añade al archivo .class de esa clase que implementa la interfaz Serializable. Por lo tanto, de que trata esta JVM archivo de clase de una manera especial (puede ser un trabajo pesado asignación de recursos), debido a instancia de esta clase podría ser serializado. Para las clases normales, se añade CA FE hexagonal.

Aha !! Entiendo su confusión.

  • CA FE el número mágico para un archivo de código de bytes; es decir, el archivo se obtiene cuando se compila una clase. El archivo de código de bytes para cualquier clase tiene este número mágico, si es serializable o no serializable.

  • AC ED es el número mágico de un archivo de objeto Java serializado; es decir, el archivo de serializar una instancia de una clase serializable.

usted está mezclando hasta dos conceptos diferentes (clases e instancias) y sus respectivas representaciones.

Así que la respuesta a su pregunta es ... por supuesto puede escribir sus propias interfaces de marcador! No hay nada especial para el compilador de una clase que implementa una interfaz de marcador.

Sin embargo, le será imposible duplicar la ejecución de Java objeto deserialización en Java puro. deserialización objetos utiliza una puerta trasera (el método Unsafe.allocateInstance) para crear objetos sin invocar sus constructores. Que yo sepa, este método no puede ser llamado desde el código Java normal. (E incluso si puede, no debería ser ...)

Otros consejos

Por supuesto que se puede escribir una interfaz de marcador. Una interfaz de marcador es generalmente sólo una interfaz con ningún método en absoluto (por lo que cualquier clase podría implementarlo).

parecen pensar que las interfaces de marcadores tienen algunas propiedades mágicas que hacen algo por su cuenta. Ese no es el caso. En cambio algunos otro código puedan reaccionar ante la presencia de la interfaz de marcador en un objeto y actuar de manera diferente cuando una clase implementa. Pero el marcador propia interfaz no hacer nada .

package com.example;
interface MarkerInterface {}

Aquí tienes una. Sólo CopyPaste en com/example/MarkerInterface.java, compilación y utilizarlo!

El siguiente es un ejemplo de uso:

class SomeClass implements MarkerInterface {
    // ...
}

No se puede crear una interfaz de marcador que tendrá significado para la JVM, como la interfaz java.io.Serializable hace. Aunque se puede crear una interfaz de marcador que compruebe en su propio código usando instanceof.

Sin embargo el uso de interfaces de marcador de esta manera es generalmente desalentar ahora que tenemos anotaciones . Marcado de métodos de clase y campos en diferentes formas, para su posterior procesamiento en tiempo de compilación utilizando el herramienta de procesamiento de anotación (aPT) o en tiempo de ejecución utilizando la reflexión es lo anotaciones fueron creadas.

Así que en lugar de crear una interfaz de marcador y usarlo de esta manera:

class MyClass implements MyMarkerInterface {
}

Probablemente debería crear una anotación y usarlo de esta manera:

@MyAnnotation
class MyClass {
}

Depende de lo que entendemos como una interfaz de marcador. Pero, en general, se puede utilizar instanceof en el código para comprobar si una instancia implementa una interfaz de marcador y luego hacer algo con este caso ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top