¿Cómo puedo hacer esto:lanzado a través del cargador de clases?
class Foo {
public static Foo get() throws Exception {
ClassLoader cl = new URLClassLoader(new URL[]{"foo.jar"}, null); // Foo.class is in foo.jar
return (Foo)cl.loadClass("Foo").newInstance(); // fails on class cast
}
}
Lo que necesito es para la JVM para considerar la instancia de Foo cl como si se trata de una instancia de Foo del cargador de clases del código de ejecución.
he visto estos enfoques, ninguno de ellos bueno para mí (el ejemplo anterior es un ejemplo de juguete):
- carga la clase (o una interfaz independiente) por un cargador de clases que es un padre de tanto el código de llamada como el classloader creado
- Serializar y deserializar el objeto.
lo tanto, si ni siquiera podemos emitir estos nuevos casos, ¿cómo podemos utilizar? Si todo lo que podemos hacer es 'Object obj = cl.loadClass (" Foo "). NewInstance();', ¿cómo llamamos a los métodos de la nueva instancia de Foo? – Pacerier
@Pacerier: bueno, podrías usar el reflejo. Pero un caso más práctico es hacer que las clases amplíen las clases o implementen interfaces de un cargador de clases padre en la jerarquía de la delegación que también están disponibles para el resto del código. Pero en el código de ejemplo, no hay un cargador de clases principal (el segundo parámetro para el constructor es nulo) ... –
¿El rendimiento de la segunda opción será más rápido que el uso de la reflexión? ¿O es cierto que internamente usa la reflexión de todos modos? – Pacerier