2010-12-15 18 views
56
documentación

El Java para Class dice:¿cuál es el objeto Clase (java.lang.Class)?

Class objetos se construyen automáticamente por la máquina virtual de Java como clases se cargan y por llamadas al método defineClass en el cargador de clases.

¿Cuáles son estos Class objetos? ¿Son los mismos que los objetos instanciados de una clase llamando al new?

Además, por ejemplo object.getClass().getName() ¿cómo se puede escribir todo en la superclase Class, incluso si no heredo de java.lang.Class?

Respuesta

71

Nada se convierte en Class. Cada Object en Java pertenece a un cierto class. Es por eso que la clase Object, que es heredada por todas las demás clases, define el método getClass().

getClass(), o la clase literal - Foo.class devolver un objeto Class, que contiene algunos metadatos sobre la clase:

  • nombre
  • paquete
  • métodos
  • campos
  • constructores
  • anotaciones

y algunos métodos útiles como la fundición y varias comprobaciones (isAbstract(), isPrimitive(), etc.). the javadoc muestra exactamente qué información puede obtener sobre una clase.

Así, por ejemplo, si se da un método suyo un objeto, y que desea procesarlo en caso de que se anota con el @Processable anotación, entonces:

public void process(Object obj) { 
    if (obj.getClass().isAnnotationPresent(Processable.class)) { 
     // process somehow; 
    } 
} 

En este ejemplo, se obtiene los metadatos sobre la clase del objeto dado (cualquiera que sea), y verifique si tiene una anotación determinada. Muchos de los métodos en una instancia de Class se denominan "operaciones reflexivos", o simplemente "la reflexión. Read here sobre la reflexión, por qué y cuándo se utiliza.

Tenga en cuenta también que las enumeraciones y las interfaces también representar un objeto Class, y tienen la . metadatos respectiva

para resumir - cada objeto en java ha (pertenece a) una clase, y tiene un Class objeto respectivo, que contiene metadatos acerca de ella, que es accesible en tiempo de ejecución

+26

Y es divertido pensar en esto más. La clase 'Class' hereda de' Object' en sí. 'Class.class' devuelve un objeto' Class' que representa la clase 'Class'. Puedes reflexionar sobre la reflexión. MI CABEZA ASPLODE. – cdhowie

+0

@cdhowie No he usado mucho Ruby, ¿eh? :-) –

+1

@pst: Tengo. Me hace querer lastimar a la gente.Cualquier lenguaje/framework con [muchos] (http://ruby-doc.org/core/classes/Object.html) métodos en su tipo de raíz merece ser enterrado. Tiene el síndrome de PHP al estilo aleatorio-mierda-al-API-sin-ningún-síndrome de previsión. Cue las llamas ... – cdhowie

7

getClass() es un método que. devuelve un objeto que es un ejemplo de java.lang.Class ... no hay ningún casting involucrado. La conversión se vería así:

Class<?> type = (Class<?>) object; 
34

Un objeto de clase es una especie de metaobjeto que describe la clase de un objeto.Se usa principalmente con las capacidades de reflexión de Java. Puedes pensarlo como un "anteproyecto" de la clase real. P.ej. usted tiene una clase Coche como este:

public class Car { 
    public String brand; 
} 

Luego puede construir un objeto de clase que describa su clase de "automóvil".

Class myCarClass = Class.forName("Car"); 

Ahora se puede hacer todo tipo de consulta en su clase de coches en ese objeto Clase:

myCarClass.getName() - returns "Car" 
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field 

y así sucesivamente. Cada objeto java tiene un método getClass() que devuelve el objeto Class que describe la clase del objeto Java. Por lo que podría hacer algo como:

Car myCar = new Car(); 
Class myCarClass = myCar.getClass(); 

Esto también funciona para objetos que no conoce, por ejemplo, objetos que se obtiene de la parte exterior:

public void tellMeWhatThisObjectsClassIs(Object obj) { 
    System.out.println(obj.getClass().getName()); 
} 

Se podía alimentar a este método cualquier objeto java y imprimirá la clase real del objeto que le ha asignado.

Al trabajar con Java, la mayoría de las veces no tiene que preocuparse por los objetos de clase. Sin embargo, tienen algunos casos de uso prácticos. P.ej. le permiten instanciar mediante programación objetos de una determinada clase, que se utiliza a menudo para la serialización y deserialización de objetos (por ejemplo, convertir objetos Java a XML y viceversa, en su mayoría, de vuelta).

Class myCarClass = Class.forName("Car"); 
Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car(); 

También puede usarlo para encontrar todos los campos o métodos de la clase, etc., lo cual es muy útil en ciertos casos declarados. Por ejemplo, si le entregan su método a un objeto desconocido y necesita saber más al respecto, como si incluye alguna interfaz, etc., la clase es su amiga aquí.

En pocas palabras, las clases de Clase, Campo, Método, etc. que se encuentran en el paquete java.lang.reflect le permiten analizar sus clases, métodos, campos definidos, crear nuevas instancias de ellos, llamar a métodos todos tipos de otras cosas y te permiten hacer esto de forma dinámica en tiempo de ejecución.

+0

Clase c1 = Clase de automóvil; ¿Qué es esta "clase"? ¿Es una variable pública que existe en todas las clases? –

+4

Es básicamente azúcar sintáctico. Es algo que el compilador evalúa como algo que carga el objeto de clase con el nombre dado. Aproximadamente equivalente a Class.forName ("nombre de clase totalmente calificado"), pero se verifica que la clase exista en tiempo de compilación mientras Class.forName() se ejecuta en tiempo de ejecución. –

2

Un objeto de clase es una instancia de clase (java.lang.Class). Debajo de la cita tomada de javadoc de clase debe responder a su pregunta

La clase no tiene un constructor público. En cambio, los objetos de clase los construye automáticamente Java Virtual Machine a medida que se cargan las clases y mediante llamadas al método defineClass en el cargador de clases.

4

También me gustaría añadir a la respuesta ColinD 's que getClass devolverá el mismo objeto para las instancias de mismo tipo. Esto imprimirá cierto:

MyOtherClass foo = new MyOtherClass(); 
    MyOtherClass bar = new MyOtherClass(); 
    System.out.println(foo.getClass()==bar.getClass()); 

en cuenta que no es igual a , estoy usando ==.

Cuestiones relacionadas