Cuando utiliza utiliza Class.forName("SomeImpl")
, que está obteniendo la clase a través del cargador de clases actual (es decir, el cargador de la clase a la que estás haciendo llamar el método).También será initialize la clase. En realidad es lo mismo que llamar al Class.forName("SomeImpl", true, currentLoader)
donde currentLoader
sería el cargador de clases de la persona que llama. Ver los detalles here.
El segundo método requiere que se elija primero un cargador de clases. No lo escriba como ClassLoader.loadClass("SomeImpl")
ya que es no un método estático. Te necesita algo así como
final ClassLoader cl = this.getClass().getClassLoader();
Class theClass = cl.loadClass("SomeImpl");
Mente que subclases de cargador de clases deben reemplazar el método findClass en lugar de loadClass
. Esto es lo mismo que llamar al método (protegido) loadClass("SomeImpl", false)
, donde el segundo argumento indica si se debe hacer o no el enlace.
Existen diferencias más sutiles ... El método loadClass
espera un nombre de clase binaria según lo especificado por la especificación del lenguaje Java, mientras que forName
también podrían utilizarse con cadenas que representan los tipos primitivos o clases de matriz.
En general, es mejor usar Class.forName
, si es necesario, especificando un cargador de clases específico y si debe inicializarse o no, luego deje que la implementación descubra el resto. Usar cargadores de clases directamente es bueno para encontrar recursos en un jar o en el classpath.
Personalmente trato de no utilizar cadenas literales en mi código ... Considere escribir 'SomeImpl.class.getSimpleName()' en lugar del literal codificado (ahorra dolores de cabeza al renombrar la clase). – Yuval
@Yuval: ordinariamente estoy de acuerdo contigo, pero en el caso de 'Class.forName()' el * whole point * es que le pasas una cadena. Si tiene una instancia 'Clase' rondando, entonces no necesita llamar 'Class.forName()'. Y si puede escribir 'SomeImpl.class' entonces puede escribir' new SomeImpl() 'en lugar de usar reflection en absoluto. –
@Yuval, la carga dinámica de clases es una función central en Java y no tiene nada que ver con el uso de cadenas en lugar de clases. [RE. Pryden cubre eso ya] – bestsss