2009-10-01 13 views

risposta

10

La risposta breve (certamente per OSGi 4.1, non sicuro di 4.2) è che non è possibile ottenere il classloader di un pacchetto. Tuttavia, l'interfaccia Bundle espone un metodo loadClass() e ciò consentirebbe di scrivere un classloader che avvolge l'API del bundle e delega a tale metodo loadClass(). Oppure puoi risparmiare un po 'di tempo e utilizzare invece la classe BundleDelegatingClassLoader di Spring DM.

1

Nel normale codice Java, è possibile ottenere il caricatore di classe che ha caricato un dato oggetto con

object.getClass().getClassLoader(); 

O anche solo

SomeType.class.getClassLoader(); 

Lo stesso vale per Equinox, basta usare un oggetto o di tipo che proviene dal pacchetto che ti interessa.

+1

Ma poi si ha un problema di bootstrap. Come ottieni quella prima istanza? – Geniedesalpages

+0

Se si ha dipendenza dall'altro pacchetto, è possibile fare riferimento all'altra classe direttamente (SomeType.class) delegando i classloader di osgi tra i pacchetti in modo che provenga ancora dall'altro classloader. Se non si dispone di una dipendenza è necessario ottenere l'oggetto Bundle (utilizzando PackageAdmin) e utilizzare il pacchetto # loadClass come menzionato nell'altra risposta. –

+0

Il caricamento della classe J2SE non è adatto per J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan

31

In OSGi 4.3 è possibile utilizzare:

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

Il caricatore classe di un pacchetto può essere ottenuto tramite l'interfaccia BundleWiring. Ecco un breve esempio:

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