¿Qué .class
significa en Java? Por ejemplo, si creé una clase llamada Print
. ¿Qué Print.class
devuelve?
.class
sintaxis que solo está relacionada de manera incidental con la .class
extensión del nombre de archivo.
¿Qué .class
significa en Java? Por ejemplo, si creé una clase llamada Print
. ¿Qué Print.class
devuelve?
.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 al java.lang.Class
objeto de clase literal -
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 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());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
?
new Intent(this, Activity.class
? ¿Intentará averiguarlo class 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:
String string = "hello";
System.out.println(string.getClass().toString());
Esto generará:
class java.lang.String
Esta es la clase del objeto de cadena :)
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, considere Math.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
sintaxis
Si 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.
boolean b;
Class c = b.getClass(); // compile-time error
Class 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.
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.
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.
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 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.
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:
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