Algunas clases de la API estándar de Java se tratan de forma ligeramente diferente a otras clases. Estoy hablando de aquellas clases que no se podrían implementar sin un soporte especial del compilador y / o JVM.
Los que se me ocurren de inmediato son:
Object
(obviamente) ya que, entre otras cosas, no tiene una superclase.String
ya que el idioma tiene soporte especial para el operador +.Thread
ya que tiene este método mágico start () a pesar del hecho de que no hay una instrucción de código de bytes que "bifurque" la ejecución.
Supongo que todas las clases como estas se mencionan de una forma u otra en el JLS. Corrígeme si me equivoco.
De todos modos, ¿qué otras clases de este tipo existen? ¿Existe alguna lista completa de "clases glorificadas" en el lenguaje Java?
Respuestas:
Hay muchas respuestas diferentes, así que pensé que sería útil recopilarlas todas (y agregar algunas):
Clases
Interfaces
Las menciones honoríficas son para:
Nota: Dejé fuera de la lista las cosas que proporcionan JNI (como IO) porque siempre puede implementar su propia llamada JNI si así lo desea. Sin embargo, las llamadas nativas que interactúan con la JVM de manera privilegiada son diferentes.
Las matrices son discutibles: heredan Object, tienen una jerarquía entendida (Object [] es un supertipo de String []), pero son una característica del lenguaje, no una clase definida por sí misma.
fuente
SecurityManager
? ¿O algo relacionado con la reflexión o la serialización?Class
, por supuesto. Tiene sus propios literales (una distinción con la que comparteString
, BTW) y es el punto de partida de toda esa magia de reflexión.fuente
sun.misc.unsafe es la madre de todos los trucos sucios que rompen el espíritu del lenguaje.
fuente
fuente
Todas las clases de números tienen un poco de magia en forma de Autoboxing .
fuente
Dado que se mencionaron las clases importantes , mencionaré algunas interfaces:
La
Iterable
interfaz (desde 1.5): permite que un objeto participe en un bucle foreach:La
Serializable
interfaz tiene un significado muy especial, diferente de una interfaz estándar. Puede definir métodos que se tendrán en cuenta aunque no estén definidos en la interfaz (comoreadResolve()
). Latransient
palabra clave es el elemento del lenguaje que afecta el comportamiento de losSerializable
implementadores.fuente
transient
palabra claveComparable
no participa en nada interno. Puede escribir fácilmenteNewComparable
y nuevoNewArrays.sort(..)
con la misma funcionalidadfuente
Matriz de Java como en
int[].class
fuente
[I
clase;) aunque no es una clase API.java.lang.ClassLoader
, aunque el trabajo sucio real lo realiza alguna subclase no mencionada (ver 12.2.1 El proceso de carga ).fuente
No estoy seguro de esto. Pero no puedo pensar en una forma de implementar manualmente objetos IO.
fuente
Hay algo de magia en la
System
clase.System.arraycopy
es un gancho al código nativopero...
fuente
Bueno, ya que se ha mencionado el manejo especial de assert. Aquí hay algunos tipos más de excepciones que tienen un tratamiento especial por parte de jvm:
Las excepciones no son especiales, pero jvm las usa en casos especiales, por lo que no puede implementarlas usted mismo sin escribir su propio jvm. Estoy seguro de que existen más excepciones especiales.
fuente
La mayoría de esas clases no se implementan realmente con la ayuda 'especial' del compilador o JVM. Object registra algunos nativos que hurgan en las estructuras internas de JVM, pero también puede hacerlo para sus propias clases. (Admito que esto está sujeto a la semántica, "las llamadas a un nativo definido en la JVM" pueden considerarse como soporte especial de JVM).
Lo que / es / especial es el comportamiento de las instrucciones 'nuevas' y 'lanzar' en cómo inicializan estas estructuras internas.
Sin embargo, las anotaciones y los números son bastante extraños.
fuente