¿Qué significa .class en Java?

¿Qué significa .class en Java? Por ejemplo, si creé una clase llamada Print . ¿ Print.class devuelve Print.class ?

Cuando escribe .class después de un nombre de clase, hace referencia al objeto literal de clase – java.lang.Class que representa información sobre una clase dada.

Por ejemplo, si su clase es Print , entonces Print.class es un objeto que representa la clase Print en tiempo de ejecución. Es el mismo objeto que devuelve el método getClass() de cualquier instancia (directa) de Print .

 Print myPrint = new Print(); System.out.println(Print.class.getName()); System.out.println(myPrint.getClass().getName()); 

.class se usa cuando no hay una instancia de la clase disponible.
.getClass () se usa cuando hay una instancia de la clase disponible.

object.getClass () devuelve la clase del objeto dado. Por ejemplo:

 String string = "hello"; System.out.println(string.getClass().toString()); 

Esto producirá

 class java.lang.String 

Esta es la clase del objeto de cadena 🙂

Si hay una instancia de un objeto disponible, la forma más sencilla de obtener su clase es invocar Object.getClass()

La syntax .class

Si el tipo está disponible pero no hay una instancia, entonces es posible obtener una Clase al agregar .class al nombre del tipo. Esta es también la forma más fácil de obtener la Clase para un tipo primitivo.

 boolean b; Class c = b.getClass(); // compile-time error Class c = boolean.class; // correct 

Ver: docs.oracle.com sobre la clase

Solo para aclarar, este método ‘.class’ no se refiere al archivo de código de bytes que se ve después de comstackr el código Java ni a una confusión entre los conceptos de Clase vs. Objeto en la teoría OOP.

Este método ‘.class’ se usa en Java para el código Reflection. En general, puede recostackr metadatos para su clase, como el nombre completo de la clase, la lista de constantes, la lista de campos públicos, etc., etc.

Verifique estos enlaces (ya mencionados anteriormente) para obtener todos los detalles:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

Normalmente no planeas usar Reflection de inmediato cuando comienzas a construir tu proyecto. Es algo que sabes que necesitas después de tratar de administrar el código que ya funciona. Muchas veces lo necesita para administrar varias instancias de su progtwig. Quizás desee identificar cada “clon” particular para determinar si algo ya está definido, o contar el número de funciones, o simplemente registrar los detalles de una instancia particular de su clase.

Si no hay ninguna instancia disponible, la syntax de clase se usa para obtener el objeto de Clase correspondiente para una clase; de ​​lo contrario, puede usar el método getClass () para obtener el objeto de Clase. Como no hay instancia de tipo de datos primitivos, debemos usar la syntax .class para los tipos de datos primitivos.

  package test; public class Test { public static void main(String[] args) { //there is no instance available for class Test, so use Test.class System.out.println("Test.class.getName() ::: " + Test.class.getName()); // Now create an instance of class Test use getClass() Test testObj = new Test(); System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName()); //For primitive type System.out.println("boolean.class.getName() ::: " + boolean.class.getName()); System.out.println("int.class.getName() ::: " + int.class.getName()); System.out.println("char.class.getName() ::: " + char.class.getName()); System.out.println("long.class.getName() ::: " + long.class.getName()); } } 

Creo que la clave aquí es entender la diferencia entre una clase y un objeto. Un objeto es una instancia de una clase. Pero en un lenguaje completamente orientado a objetos, una Clase también es un Objeto . Entonces, llamar .class obtiene la referencia al objeto Class de esa clase, que luego puede ser manipulado.

Un literal de clase es una expresión que consiste en el nombre de una clase, interfaz, matriz o tipo primitivo, o el vacío de pseudo tipo, seguido de un ‘.’ y la clase de token. Uno de los cambios en JDK 5.0 es que la clase java.lang.Class es genérica, java.lang.Class Class , por lo tanto:

 Class p = Print.class; 

Referencias aquí:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2