2012-06-18 11 views
7

Podemos obtener objeto Class clase por 3 métodos:Diferencia entre MyClass.class y Class.forName ("className")

  • MyClass.class
  • obj.getClass
  • Class.forName (" className ")

No entiendo la diferencia entre: MyClass.class y Class.forName("className").

Porque ambos necesitarán Nombre de clase.

+0

posible duplicado de [¿Cuál es la diferencia entre llamar a MyClass.class y MyClass.getClass()] (http://stackoverflow.com/questions/2467970/whats-the-difference-between-calling- myclass-class-and- myclass- getclass) –

+0

Las sugerencias o implicaciones hechas en varias respuestas de que MyClass.class no causa una búsqueda en tiempo de ejecución son falsas. Solo causa una búsqueda * * * en tiempo de ejecución cuando se carga la clase que contiene la referencia. y una falla de búsqueda es fatal para esa carga. – EJP

Respuesta

11
Class.forName("className"); 

forName es un método estático de la clase "Clase". requerimos proporcionar el nombre completo de la clase deseada. esto se puede usar cuando se conozca el nombre de la clase en tiempo de ejecución.

ClassName.class; 

.class no es un método, es una palabra clave y se puede utilizar con tipo primitivo como int. cuando Nombre de la clase se conoce de antemano & se añade a proyectar, que el tiempo que utilice nombredeclase.class

+7

o, en resumen: búsqueda en tiempo de ejecución vs. búsqueda de tiempo de compilación –

+0

.class no es una palabra clave. – EJP

8

que no entiende la diferencia entre: MyClass.class y Class.forName("className").

Porque ambos necesitarán Nombre de clase.

La gran diferencia es cuando lo necesitan. Dado que Class.forName acepta una cadena , el nombre de la clase se puede determinar en tiempo de ejecución. Mientras que, por supuesto, MyClass.class se determina en tiempo de compilación. Esto hace que Class.forName sea útil para cargar clases de forma dinámica en función de la configuración (por ejemplo, cargar controladores de bases de datos según la configuración de un archivo de configuración).

Completando cosas: obj.getClass() es útil porque puede que no sepa la clase real de un objeto   — por ejemplo, en un método en el que acepta un argumento mediante una interfaz, en lugar de clase, como en foo(Map m). No conoce la clase de m, solo que es algo que implementa Map. (Y el 99% de las veces, se debe sin cuidado lo que su clase es, pero que el 1% cultivos de vez en cuando.)

+0

buena explicación –

1
Class.forName("className"); 

Se carga de forma dinámica basada en cadena de nombre de clase completo de la clase.

obj.getClass 

Devuelve el objeto java.lang.Class que representa la clase de tiempo de ejecución del objeto.

MyClass.class: 

A class literal es una expresión que consiste en el nombre de una clase, interfaz, matriz, o primitivo tipo, o la de tipo seudo vacío, seguido de a ''. y la clase de token. El tipo de C.class, donde C es el nombre de una clase, interfaz o tipo de matriz es Class<C>.

http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

1

Una diferencia importante es: A.class llevará a cabo la carga y la vinculación de la clase A. Class.forName ("A") llevará a cabo la carga, la vinculación y la inicialización de clase A.

Cuestiones relacionadas