2011-09-13 19 views

Respuesta

6

Estás adentrándote en el maravilloso mundo de Reflection. Usando la reflexión, puede inspeccionar las clases por programación, establecer sus campos, llamar a sus métodos, etc. Puede hacer algunas cosas realmente poderosas con él, y la mayoría de los marcos que utiliza a diario (por ejemplo, Hibernate, Spring, Guice, etc.) depende mucho de ello para que las cosas sucedan.

+4

Buena visión general.Pero creo que es importante que mientras * frameworks * puede hacer cosas maravillosas con él, el código comercial clásico generalmente * evite * usarlo (al menos directamente), porque puede * fácilmente * hacer que la estructura de su código sea un desastre ilegible. –

+2

getClass se usa generalmente en el código comercial cuando se anula el método equals, para verificar que la clase del otro objeto sea la misma que la clase de este objeto. –

2

getClass() es un método público en Object, por lo que se hereda para todas las instancias de todas las clases. Si está tratando con un super tipo de algún tipo (una súper clase o interfaz, etc.) y desea conocer la clase de implementación, getClass() le dirá la clase de cualquier objeto. Luego puede inspeccionar la clase para obtener más información.

Un ejemplo sencillo:

public static void doSomething(Object obj) { 
    if (obj.getClass().isArray()) { 
     System.out.println("It's an array"); 
    } else { 
     System.out.println("It's not an array"); 
    } 
} 

por cierto, getClass() sí mismo no es parte de la reflexión - es un método sencillo que devuelve un objeto directo (clase). Sin embargo, el objeto de clase devuelto desde getClass() se puede usar con reflexión (consulte el paquete java.lang.reflect) para descubrir muchas cosas interesantes sobre la clase.

+9

"nothing whatsoever" excepto que devuelve un tipo que es aproximadamente ** el ** tipo central en cualquier código de reflexión. –

+0

@Joachim Sauer OK - tienes razón. Eso fue un poco exagerado. He moderado mi publicación :) – Bohemian

1

Puede usar los objetos Class para la reflexión, o puede usarlos para otras cosas, como las claves en un mapa para mantener los datos sobre las cosas en un nivel de clase.

Por ejemplo, puede tener una clase con estado estático & métodos que hacen cosas como crear instancias de objetos y recopilar estadísticas. De hecho, puede tener varias clases de ese tipo, todas hacen lo mismo y todas parecen funcionar de la misma manera y, por lo tanto, tienen posibilidades de convergencia. Como la clase es estática, naturalmente tienes un mapeo de una clase a un estado y operaciones en ese estado.

Por lo tanto, puede extraer el código común de sus clases estáticas y ponerlas en una clase que proporcione todos los métodos, con la adición de un argumento Class para especificar el estado que se debe usar durante las siguientes operaciones.

Pero en mi aplicación, conozco todas mis clases. Entonces, ¿cuál es el verdadero propósito de usar este método?

Ahora que usted tiene un sistema que opera en Class objetos, puede darle objetos que no posee, tales como bibliotecas 3 ª parte que decida utilizar en su aplicación, y se puede ¡hazlo en tiempo de ejecución!

1

Los estados JavaDoc:

la clase de objeto devuelto es el objeto que está bloqueado por static synchronized métodos de la clase representada.

Es decir, si sus clases tiene un método static synchronized, la JVM utiliza la getClass() a poner un candado en el método.

+0

No hay evidencia aquí que la JVM realmente llame a getClass() para este propósito. Parece probable, pero no está implícito en el Javadoc. – EJP

+1

@EJB - El texto de javadoc citado es una ** declaración no categorica ** explícita que esto es lo que hace JVM. El lenguaje utilizado en la cita no deja lugar para "quizás/tal vez no". –

1

A veces necesitamos la instancia Class para un objeto.Al igual que programamos contra las interfaces pero necesitamos ahora el tipo real de una aplicación:

List<?> someListImplementation = geListMagically(); 
System.out.println(someListImplementation.getClass().getName()); 

Aquí es ejemplo trivial por eso que necesitamos getClass() en java.lang.Object:

Object obj = "A String"; 
System.out.println(obj.getClass().getName()); // calls Object#getClass() 
               // and prints java.lang.String :) 
11

pero en mi solicitud, conocer todas mis clases Entonces, ¿cuál es el verdadero propósito de usar este método?

Así que si escribes esto, ¿todavía sabes cuál es la clase real de things[0]?

Object[] things = new Object[]{ 
     "Hi mum", new Integer(42), /* and a whole bunch more */}; 
shuffle(things); 

En teoría, se pudiera encontrar la clase de things[0] usando una larga serie de instanceof expresiones, pero que es doloroso. Esto resuelve el problema.

Class cls = things[0].getClass(); 

Ahora, te garantizo que usted no menudo tienen que hacer este tipo de cosas. Pero cuando lo haces, la funcionalidad de Object.getClass() es bastante indispensable.

Y como otras respuestas señalan, el método getClass() es muy importante para las aplicaciones que hacen uso de la reflexión para evitar las limitaciones del tipado estático.


supongo, la otra pregunta es si la existencia del método Object.getClass() tiene ningún impacto en el rendimiento de la JVM. La respuesta es No. El método solo está exponiendo información que debe estar allí para implementar el operador instanceof. Y esta información es típicamente utilizada por el recolector de basura.

+0

¡Oye, mira, él respondió la pregunta y la respuesta a la vida, el universo y todo! – medopal

+0

Supongo que medopal acaba de disfrutar de su referencia a [42] (http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Answer_to_the_Ultimate_Question_of_Life.2C_the_Universe.2C_and_Everything_.2842.29); No creo que haya sido significado de manera negativa. Ah, y +1, por cierto (no para 42, pero para una buena respuesta). – Heinzi

+0

@medopal - mis disculpas ... a veces soy un poco "lento" al final del día –

1

Usted puede utilizar para:

  • conseguir los constructores de la clase:
Constructor[] constructors = this.getClass().getConstructors() 
  • obtener los campos de la clase (reflexión):
Field[] fields = this.getClass().getFields(); 
  • usarlo en lugar de instanceof en igual método para perserve contrato simetría del método igual (como se explica here)
if (obj == null) 
    return false; 
if (getClass() != obj.getClass()) 
    return false; 
Cuestiones relacionadas