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.
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 errorClass c =boolean.class;// correct
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.
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.
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;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.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 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.
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
sintaxis que solo está relacionada de manera incidental con la.class
extensión del nombre de archivo.Respuestas:
Cuando escribe
.class
después de un nombre de clase, hace referencia aljava.lang.Class
objeto de clase literal - que representa información sobre una clase dada.Por ejemplo, si su clase es
Print
, entoncesPrint.class
es un objeto que representa la clasePrint
en tiempo de ejecución. Es el mismo objeto que devuelve elgetClass()
método de cualquier instancia (directa) dePrint
.fuente
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? ¿Intentará averiguarloclass Activity
comparando cada clase?.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:
Esto generará:
Esta es la clase del objeto de cadena :)
fuente
getClass()
solo es útil si tiene una referencia que apunta a un objeto de la clase.ClassName.class
se puede usar incluso si la clase no tiene instancias. Por ejemplo, considereMath.class
. Cada uno es correcto para ciertas situaciones..class
y.getClass().
Si una instancia de un objeto está disponible, entonces la forma más sencilla de obtener su Clase es invocar
Object.getClass()
La
.class
sintaxisSi el tipo está disponible pero no hay una instancia, entonces es posible obtener una Clase agregando
.class
el nombre del tipo. Esta es también la forma más fácil de obtener la Clase para un tipo primitivo.Ver: docs.oracle.com sobre la clase
fuente
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.
fuente
Si no hay una instancia disponible, la
.class
sintaxis 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.class
sintaxis para los tipos de datos primitivos.fuente
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
.class
obtiene la referencia al objeto Clase de esa Clase, que luego se puede manipular.fuente
in a fully object-oriented language, a Class is also an Object
? <cita requerida>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: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
fuente