¿cuál es el objeto Class (java.lang.Class)?

La documentación de Java para Class dice:

Class objetos de Class construye automáticamente Java Virtual Machine a medida que se cargan las clases y mediante llamadas al método defineClass en el cargador de clases.

¿Cuáles son estos objetos de Class ? ¿Son los mismos que los objetos instanciados de una clase llamando a new ?

Además, por ejemplo object.getClass().getName() ¿cómo se puede object.getClass().getName() todo en Class superclase, incluso si no heredo de java.lang.Class ?

Nada se convierte en Class . Cada Object en Java pertenece a una cierta class . Es por eso que la clase Object , heredada por todas las otras clases, define el método getClass() .

getClass() , o class-literal – Foo.class devuelve un objeto Class , que contiene algunos metadatos sobre la clase:

  • nombre
  • paquete
  • métodos
  • campos
  • constructores
  • anotaciones

y algunos métodos útiles como casting y varias verificaciones ( isAbstract() , isPrimitive() , etc.). el javadoc muestra exactamente qué información puede obtener sobre una clase.

Entonces, por ejemplo, si un método tuyo recibe un objeto y quieres procesarlo en caso de que esté anotado con la anotación @Processable , entonces:

 public void process(Object obj) { if (obj.getClass().isAnnotationPresent(Processable.class)) { // process somehow; } } 

En este ejemplo, obtienes los metadatos sobre la clase del objeto dado (cualquiera que sea) y verifica si tiene una anotación determinada. Muchos de los métodos en una instancia de Class se llaman “operaciones reflexivas”, o simplemente “reflexión. Lea aquí sobre la reflexión, por qué y cuándo se usa.

Tenga en cuenta también que las enumeraciones y las interfaces también representan un objeto Class y tienen los metadatos respectivos.

Para resumir, cada objeto en Java tiene (pertenece a) una clase, y tiene un objeto de Class respectivo, que contiene metadatos al respecto, al que se puede acceder en tiempo de ejecución.

Un objeto Clase es una especie de metaobjeto que describe la clase de un objeto. Se usa principalmente con las capacidades de reflexión de Java. Puedes pensarlo como un “anteproyecto” de la clase real. Por ejemplo, tienes un automóvil de clase como este:

 public class Car { public String brand; } 

Luego puede construir un objeto Class que describa su clase “Car”.

 Class myCarClass = Class.forName("Car"); 

Ahora puedes hacer todo tipo de consultas sobre tu clase de Auto en ese objeto de Clase:

 myCarClass.getName() - returns "Car" myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field 

y así. Cada objeto java tiene un método getClass () que devuelve el objeto Class que describe la clase del objeto Java. Entonces podrías hacer algo como:

 Car myCar = new Car(); Class myCarClass = myCar.getClass(); 

Esto también funciona para objetos que no conoce, por ejemplo, objetos que obtiene del exterior:

 public void tellMeWhatThisObjectsClassIs(Object obj) { System.out.println(obj.getClass().getName()); } 

Puede alimentar este método con cualquier objeto java e imprimirá la clase real del objeto que le haya asignado.

Cuando trabajas con Java, la mayoría de las veces no tienes que preocuparte por los objetos de clase. Sin embargo, tienen algunos casos de uso prácticos. Por ejemplo, le permiten instanciar mediante progtwigción objetos de una determinada clase, que se utiliza a menudo para la serialización y deserialización de objetos (por ejemplo, convertir objetos Java a XML y viceversa, en su mayoría, de vuelta).

 Class myCarClass = Class.forName("Car"); Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car(); 

También puede usarlo para descubrir todos los campos o métodos declarados de su clase, etc., que es muy útil en ciertos casos. Entonces, por ejemplo, si le entregan su método a un objeto desconocido y necesita saber más al respecto, como si incluye alguna interfaz, etc., la clase Class es su amiga aquí.

En pocas palabras, las clases de clase, campo, método, etc. que están en el paquete java.lang.reflect le permiten analizar sus clases, métodos, campos definidos, crear nuevas instancias de ellos, métodos de llamada, todo tipo de cosas y te permiten hacer esto dinámicamente en tiempo de ejecución.

getClass() es un método que devuelve un objeto que es una instancia de java.lang.Class … no hay conversión. Casting se vería así:

 Class type = (Class) object; 

También me gustaría agregar a la respuesta de ColinD que getClass devolverá el mismo objeto para instancias del mismo tipo. Esto se imprimirá verdadero :

  MyOtherClass foo = new MyOtherClass(); MyOtherClass bar = new MyOtherClass(); System.out.println(foo.getClass()==bar.getClass()); 

Tenga en cuenta que no es igual , estoy usando == .

Un objeto Class es una instancia de Class (java.lang.Class). La cita siguiente tomada de javadoc de la clase debe responder a su pregunta

La clase no tiene constructor público. En cambio, los objetos de clase los construye automáticamente Java Virtual Machine a medida que se cargan las clases y mediante llamadas al método defineClass en el cargador de clases.