¿Qué significa .class en Java?

149

¿Qué .classsignifica en Java? Por ejemplo, si creé una clase llamada Print. ¿Qué Print.classdevuelve?

Quinn Wei
fuente
Me temo que no entiendo completamente lo que estás preguntando. Si pudiera elaborar un poco más, alguien podría proporcionarle información más útil
Paul Walker
28
Esto ciertamente me parece una pregunta real. Solo estaba haciendo esta pregunta yo mismo, y me encontré aquí después de una búsqueda rápida en Google. ¡Supongo que no debería haberme molestado si hubiera sabido que mi pregunta no era real!
Doctor Jones
1
Además, creo que debido a la incomodidad de la cadena de búsqueda en particular, hay poco escrito o encontrable sobre esta pregunta. Aparte de los documentos de API vinculados anteriormente, nunca he visto esta notación mencionada en ningún otro lugar (aunque a menudo se ve utilizada en la reflexión).
jordanpg
2
@MadProgrammer, el OP pregunta por la .classsintaxis que solo está relacionada de manera incidental con la .classextensión del nombre de archivo.
jordanpg

Respuestas:

143

Cuando escribe .classdespués de un nombre de clase, hace referencia al java.lang.Classobjeto de clase literal - que representa información sobre una clase dada.

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

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Javier
fuente
2
¿Cuáles son algunas de las cosas que uno puede hacer con un objeto de clase?
Kevin
77
@Kevin Consulte la documentación de la API para java.lang.Class .
Patricia Shanahan
Aplicación: para acceder a los campos privados, por ejemplo: Writer.class.getDeclaredField("writeBuffer").
jordanpg
2
Entonces, ¿cuál es el tipo de Print.class?
Zhipeng YANG
1
¿Y cómo se maneja Android new Intent(this, Activity.class? ¿Intentará averiguarlo class Activitycomparando cada clase?
Zhipeng YANG
56

.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 generará:

class java.lang.String

Esta es la clase del objeto de cadena :)

Christopher
fuente
77
getClass()solo es útil si tiene una referencia que apunta a un objeto de la clase. ClassName.classse puede usar incluso si la clase no tiene instancias. Por ejemplo, considere Math.class. Cada uno es correcto para ciertas situaciones.
Patricia Shanahan
Brillante explicación. Hasta el punto. Me encanta cómo identificaste la distinción entre .classy.getClass().
Sevastyan Savanyuk
6

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

La .classsintaxis

Si el tipo está disponible pero no hay una instancia, entonces es posible obtener una Clase agregando .classel 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

Andrés
fuente
6

Solo para aclarar, este método '.class' no se refiere al archivo de bytecode que ve después de compilar 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 recopilar metadatos para su clase, como el nombre completo de la clase calificada, la lista de constantes, la lista de campos públicos, etc.

Consulte 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 planea usar Reflection de inmediato cuando comienza a construir su proyecto. Es algo que sabe que necesita después de intentar administrar el código que ya funciona. Muchas veces lo necesita para administrar múltiples instancias de su programa. Tal vez 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.

Salvador Valencia
fuente
3

Si no hay una instancia disponible, la .classsintaxis 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 una instancia del tipo de datos primitivos, tenemos que usar la .classsintaxis 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());
       }
    }
Ranjeet
fuente
1

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 totalmente orientado a objetos, una Clase también es un Objeto . Por lo tanto, llamar .classobtiene la referencia al objeto Clase de esa Clase, que luego se puede manipular.

Jerjes
fuente
44
in a fully object-oriented language, a Class is also an Object? <cita requerida>
Sam Dufel
0

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 pseudotipo, 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<T>, por lo tanto:

Class<Print> 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

PbxMan
fuente