2009-10-01 5 views

Respuesta

10

La respuesta corta (sin duda para OSGi 4.1, no estoy seguro de 4.2) es que no puede obtener el cargador de clases de un paquete. Sin embargo, la interfaz Bundle expone un método loadClass() y esto le permite escribir un cargador de clases que envuelve la API del paquete y delega a ese método loadClass(). O puede ahorrar algo de tiempo y usar la clase BundleDelegatingClassLoader de Spring DM en su lugar.

1

en código Java normal, se puede obtener el cargador de clases que carga un objeto dado con

object.getClass().getClassLoader(); 

O incluso

SomeType.class.getClassLoader(); 

Lo mismo se aplica a Equinox, sólo tiene que utilizar un objeto o tipo que viene del paquete que le interesa.

+1

Pero entonces tiene un problema de arranque. ¿Cómo se obtiene esa primera instancia? – Geniedesalpages

+0

Si tiene dependencia del otro paquete, puede hacer referencia directamente a la otra clase (SomeType.class) que los cargadores de clase osgi delegan entre los paquetes, por lo que aún procede del otro cargador de clases. Si no tiene una dependencia, necesita obtener el objeto Bundle (usando PackageAdmin) y usar Bundle # loadClass como se menciona en la otra respuesta. –

+0

La carga de la clase J2SE no se ajusta a J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan

31

En OSGi 4.3 se puede usar:

bundle.adapt(BundleWiring.class).getClassLoader() 
4

El cargador de clases de un paquete se puede obtener a través de la interfaz BundleWiring. Aquí un pequeño ejemplo:

Bundle bundle = bundleContext.getBundle(); 
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); 
ClassLoader classLoader = bundleWiring.getClassLoader(); 
Cuestiones relacionadas