2010-01-29 12 views
41

Desde el Java tutorial:¿Qué es un literal de clase en Java?

Por último, también hay un tipo especial de literal llamado clase literal, formada mediante la adopción de un nombre de tipo y añadiendo ".class"; por ejemplo, String.class. Esto se refiere al objeto (del tipo Class) que representa el tipo en sí.

¿A qué tipo de variable se puede asignar este literal?

Por favor, dé un pequeño ejemplo si es posible.

Respuesta

41
Class<String> c = String.class; 

Mira la Javadoc for java.lang.Class para ver lo que puede hacer con uno de estos pequeños - en su mayoría relacionados con la reflexión

2

En los ejemplos es calle detrás de esa manera:

Class myClass = MyClass.class 

o

MyClass.class.getResourceAsStream("config.properties"); 
28

Para entender eso, debe comprender que La cadena es una instancia (objeto) de la clase Clase. Un literal de cadena (por ejemplo, "I am a string") es una notación que representa una instancia (objeto) de la clase String, mientras que un literal de clase (por ejemplo, Hashtable.class) es una notación que representa una instancia de la clase Clase.

+1

Buena explicación. –

+0

@shinkou String es una instancia (objeto) de la clase Class. ¿Cómo? Debería ser "String.class es una instancia (objeto) de la clase Class" ¿verdad? – Ani

+0

@Ani String es también una instancia de la clase Class a la que se le asigna la clase literal String.class. Piensa en 'String str =" I'm a string ";', donde a 'str' se le asigna un String literal" I am a string ". – shinkou

19

Gracias a las otras buenas respuestas aquí, ya saben lo que es, pero aquí hay un ejemplo de uso típico que puede aclarar también:

private static Logger log = Logger.getLogger(YourClassHere.class); 

Como el código indica, se trata de una línea en la que estamos inicialización un marco de registro (en este ejemplo, estoy usando el paquete org.apache.log4j, pero el principio se extiende a otros marcos). El método getLogger() requiere un literal de clase para que sepa qué está registrando (es decir, la clase del objeto actual).

+2

Esto es, ser, aproximadamente 1000 veces más útil que citar JavaDocs o alguna otra definición; ¡Gracias! – Pureferret

3

El literal en sí es MyClass. Si escribe MyClass.class, obtendrá una referencia al objeto de clase. Si escribe new MyClass(), usa el literal para obtener una instancia del objeto de clase que obtiene por MyClass.class. Desde la instancia, obtienes el mismo objeto de clase llamando al myClassInstance.getClass().

No estoy 100% seguro, pero el literal en sí no se puede asignar a ninguna variable. Lo que puede hacer es obtener el nombre de la clase como cadena y usar el marco de reflexión para crear una instancia.

+0

Claro que puedes. De lo contrario, no podría pasarlo como parámetro de una función. El tipo de literal es Clase que se puede asignar a referencias de ese tipo. – jbruni

+0

El literal en sí no es el nombre de la clase. Según https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2 el literal de la clase es la 'clase 'del token. Desde el JLS: "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 ". Tenga en cuenta que no es el nombre de la clase, sino el nombre seguido de '.class'. –

10

Según the JLS

15.8.2 literales Clase

Una clase literal es una expresión que consiste en el nombre de una clase, interfaz, matriz o tipo primitivo seguido de un . y el token class. El tipo de una clase literal es Class.Evalúa el objeto Class para el tipo nombrado (o para void) según lo definido por el cargador de clases de definición de la clase de la instancia actual.

1

Para entender eso, debe comprender que String es un instance (object) de superclass (parent class)Object.

class String valor s 's instance (object)' es un String literal (por ejemplo "I am a string."):

class | instance (object) | literal 
------------------------------------------------ 
String | instance_name = | "I am a string." 

mientras que class Object valor s 's instance (object)' es un Class literal - (por ejemplo Hashtable.class) que se refiere a class Hashtable 's instance (object)

class  | instance (object) | literal 
------------------------------------------------ 
Hashtable | instance_name  | Hashtable. 
+0

'String' no es una instancia de nada, y ciertamente no de ninguna superclase. –

0

Cuando la JVM carga sus clases de aplicación, las almacena con java.class.Class objetos. Por lo tanto, generalmente hay varias instancias de tipo Class en memoria que representan sus clases. Entonces puede hacer algo como esto:

Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class 
bicycleClass.getName(); // returns your class name 
bicycleClass.getDeclaredMethods(); // returns your (declared) class methods 
Cuestiones relacionadas