2011-01-06 21 views

Respuesta

34

El operador new crea un nuevo objeto de un tipo que se conoce estáticamente (en tiempo de compilación) y puede llamar a cualquier constructor en el objeto que intenta crear. Es la forma preferida de crear un objeto: es rápido y la JVM realiza muchas optimizaciones agresivas.

Class.forName().newInstance() es una construcción dinámica que busca una clase con un nombre específico. Es más lento que usar new porque el tipo de objeto no se puede codificar de forma rígida en el bytecode, y porque la JVM puede tener que verificar los permisos para asegurarse de tener la autoridad para crear un objeto. También es parcialmente inseguro porque siempre usa un constructor de argumento cero, y si el objeto que intentas crear no tiene un constructor nullary arroja una excepción.

En resumen, use new si conoce en tiempo de compilación el tipo de objeto que desea crear. Use Class.forName().newInstance() si no sabe qué tipo de objeto va a hacer.

+1

Es una pregunta popular de Entrevista, y esta es una gran respuesta ... gracias –

+0

puede obtener constructores que requieren argumentos y usarlos para instanciar un objeto a través de la API de reflexión. –

+0

Solo una nota, 'ClassNotFoundException' está marcada, por lo que no puede compilar esto:' try {optlib.SomeClass obj = new optlib.SomeClass(); } catch (ClassNotFoundException e) {} '. En este caso, debe usar 'Class.forName(). NewInstance()'. –

1

Class.forName va a hacer una búsqueda para encontrar el objeto Class para YourClass.

El uso del nuevo operador debe ser el mismo que YourClass.class.newInstance().

4

Class.forName solo puede llamar al constructor predeterminado (sin parámetros) y se puede proporcionar el nombre de clase durante el tiempo de ejecución, p. Ej. el nombre del controlador db leído desde un archivo de configuración.

+0

Esto no es cierto, puede obtener constructores que requieren argumentos y usarlos para instanciar un objeto a través de la API de reflexión. Sin embargo, el método newInstance específicamente llama al constructor no-arg y requiere que sea visible y accesible. La respuesta de templatetypedef es la más completa/correcta e informativa. – LINEMAN78

0

Si bien ambos hacen efectivamente lo mismo, debe usar el nuevo operador en lugar de hacer Class.forName ('clase'). GetInstance(). Este último usa la API de reflexión para buscar la clase en tiempo de ejecución. Al utilizar el nuevo operador, la VM sabrá de antemano que desea usar esa clase y, por lo tanto, será más eficiente.

2

Class.forName('myClass').newInstance() carga la clase si no está cargada. Aquí llama al constructor inicial y solo ejecuta la parte estática del constructor.

El operador new se utiliza para inicializar objetos nuevos.

Puede crear muchas instancias desde el operador new y la diferencia Class.forName() es la segunda vez que crea un newInstance(), los bloques estáticos no se inicializarán.

Un buen ejemplo de Class.forName('myClass).newInstance() es el controlador JDBC

Class.forName("com.mysql.JDBC.Driver").newInstance() 
+0

¿Qué sucede si uso la clase ? Inst1 = (Clase ) Class.forName ('myClass) .getInstance() ...... Clase inst2 = (Clase ) Class.forName (' myClass) .getInstance(). ............. Esto hará que las instancias múltiples sean correctas. – i2ijeya

+1

Bueno, no encuentro un método getInstance(). ¿Vos si? – Nipuna

+0

corregido ....... – i2ijeya

4

Class.forName("your class name").newInstance() es útil si necesita crear instancias de clases de forma dinámica, ya que no tiene que codificar el nombre de la clase para crear un objeto.

Imagine un escenario donde carga clases dinámicamente desde una fuente remota. Sabrá sus nombres pero no podrá importarlos en tiempo de compilación. En este caso, no puede usar new para crear nuevas instancias. Esa es (una razón) por la cual Java ofrece el método newInstance().

+0

¡Genial! ¡Es una respuesta útil! –

-1

Si no hay un constructor de cero argumentos de un objeto, también creará un objeto y no arrojará ninguna excepción, por favor encuentre los siguientes fragmentos de código.

try { 
    Class o = Class.forName("com.myCompany.MyClass"); 

    Constructor m = o.getConstructor(Integer.class,String.class); 
    m.newInstance(new Integer(0),new String("")); 

} catch (ClassNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (InstantiationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (SecurityException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (NoSuchMethodException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IllegalArgumentException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (InvocationTargetException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
3

La principal diferencia es Class.forName('your class name').newInstance() es dinámico como el tipo no tiene por qué estar codificado en el código.

3

Class.forName("your class name").newInstance() se utiliza cuando se desea obtener una instancia formar un trabajo de clase similar a new, pero es útil cuando se desea conseguir instancia de una clase en un archivo JAR o servidor remoto y no puede importación se en tiempo de compilación.

ex: Class.forName("YOUR JDBC DRIVER").newInstance(), no puede importar la clase JDBC en tiempo de compilación.

+1

El ejemplo de JDBC no es muy bueno, la necesidad de llamar 'newInstance()' solo existía para algunas versiones anteriores del controlador MySQL JDBC. –

0

Asumamos com.statckoverflow.Test

Class.forName - Se carga la clase de prueba y devolver el objeto Class clase que contiene los metadatos de la clase Test como nombre, paquete, constructor, anotaciones, métodos, campos.

newInstance() - Se utiliza para crear instancias de objetos nuevos utilizando Java Reflection. Se llamará internamente al constructor de parámetro cero en la clase Test. Esto significa que el objeto de clase Class creará el objeto de clase Test llamando al constructor de parámetro cero. Podemos usar el reflejo para detalles de la clase Test. Como constructores, métodos, etc.

new operador - Crea el nuevo objeto para la instancia de clase Class y puede llamar a sus constructores.

Cuestiones relacionadas