¿Cuál es la diferencia entre new
operador y Class.forName(...).newInstance()
? Ambos crean instancias de una clase, y no estoy seguro de cuál es la diferencia entre ellos.¿Cuál es la diferencia entre el nuevo operador y Class.newInstance()?
Respuesta
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.
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()
.
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.
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
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.
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()
¿Qué sucede si uso la clase
Bueno, no encuentro un método getInstance(). ¿Vos si? – Nipuna
corregido ....... – i2ijeya
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()
.
¡Genial! ¡Es una respuesta útil! –
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();
}
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.
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.
El ejemplo de JDBC no es muy bueno, la necesidad de llamar 'newInstance()' solo existía para algunas versiones anteriores del controlador MySQL JDBC. –
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.
- 1. ¿Cuál es la diferencia entre el operador "=" y "==" en Bash?
- 2. ¿Cuál es la diferencia entre VBScript's y el operador &?
- 3. ¿cuál es la diferencia entre crear y nuevo?
- 4. ¿Cuál es la diferencia cuando se aplica un nuevo operador?
- 5. Cuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
- 6. ¿Cuál es la diferencia entre '->' (operador de flecha) y '.' (operador de punto) en Objective-C?
- 7. diferencia entre el nuevo y anular
- 8. cuál es la diferencia entre operador de punto y operador de resolución de alcance
- 9. ¿Cuál es la diferencia entre nuevo en un constructor y nuevo en una declaración de miembro?
- 10. ¿cuál es la diferencia entre:.! y: r !?
- 11. ¿Cuál es la diferencia entre .ToString (+) y ""
- 12. Cuál es la diferencia entre $ y jQuery
- 13. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 14. ¿Cuál es la diferencia entre dict() y {}?
- 15. Cuál es la diferencia entre $ (...) y `...`
- 16. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 17. En Actionscript 3, ¿cuál es la diferencia entre el operador "in" y el método "hasOwnProperty"?
- 18. ¿Cuál es la diferencia entre {0} y ""?
- 19. Cuál es la diferencia entre = y: =
- 20. ¿Cuál es la diferencia entre ".equals" y "=="?
- 21. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 22. ¿Cuál es la diferencia entre + = y = +?
- 23. ¿Cuál es la diferencia entre " " y ""?
- 24. ¿Cuál es la diferencia entre is_a y instanceof?
- 25. ¿Cuál es la diferencia entre el NSImage y el UIImage?
- 26. ¿Cuál es la diferencia entre el tenedor y el hilo?
- 27. ¿cuál es la diferencia entre el objetivo y el proyecto?
- 28. Backbone.Js - ¿Cuál es la diferencia entre el y $ el?
- 29. ¿Cuál es la diferencia entre el mango y el hilo?
- 30. ¿Cuál es la diferencia entre el JSP y el JSTL?
Es una pregunta popular de Entrevista, y esta es una gran respuesta ... gracias –
puede obtener constructores que requieren argumentos y usarlos para instanciar un objeto a través de la API de reflexión. –
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()'. –