Estamos ampliando nuestra aplicación java para admitir complementos. Parte de eso incluye mantener los complementos aislados de nuestras propias clases, por lo que cada complemento vivirá en su propio cargador de clases.Implementación de un cargador de clase de filtro
También planeamos proporcionar a los complementos un marco de Java para trabajar, por lo que deberá estar expuesto a los complementos. Este marco de Java también contiene clases que deberán ser accesibles desde nuestro propio código de Java, por lo tanto, también deberá ser accesible para nuestro propio código de Java.
El problema es que si el framework java vive en el cargador de clases del sistema (donde vive nuestro propio código java), no podemos dar a los plugins el aislamiento que queremos. Si optamos por separar el marco java en un cargador de clases diferente y usamos ese como el padre del cargador de clases de los complementos, el marco java no será visible para nuestras propias clases.
La solución actual que tenía en mente era implementar un cargador de clase de filtrado. El framework java vivirá en el cargador de clases del sistema, pero este cargador de clases filtrará todo desde el cargador de clases del sistema, excepto el marco java y usaré este cargador de clases como el cargador de clases padre de los complementos.
Aquí hay una aplicación aproximada de ella:
public class FilteringClassLoader extends ClassLoader {
private URLClassLoader _internalLoader;
public FilteringClassLoader(ClassLoader parent) {
super(parent);
// load our java framework to this class loader
_internalLoader = new URLClassLoader(...)
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
// first, try to load from our internal class loader
// that only sees the java framework if that works, load the class
// from the system class loader and return that. otherwise, the class
// should be filtered out and the call to loadClass will throw as expected
_internalLoader.loadClass(name);
Class<?> retClazz = super.loadClass(name);
return retClazz;
}
}
Sin embargo, esto tiene varios problemas de la manera que lo veo:
- El uso de un URLClassLoader separado, sólo para ver si la clase debe ser filtrada se siente como un truco para mí.
- Cuando un complemento carga una clase, ese cargador de clase clase padre será el cargador de clases del sistema, lo que obviamente frustra todo el propósito de lo que estoy tratando de lograr.
¿Cómo resuelves este tipo de problema?
¿Es esto diferente de las personas que introducen dependencias en los paquetes 'com.sun' en la biblioteca JRE? ¿O hay más restricciones? – McDowell
no estoy seguro de lo que quiere decir –