Ho letto molto codice equinozio per questo, ma non riesco ancora a capire un modo non hacky di ottenere il classloader per un bundle di osgi nell'installazione di Eclipse equinox. Ce n'è uno?Come ottenere il classloader per un pacchetto in equinozio?
risposta
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.
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.
In OSGi 4.3 è possibile utilizzare:
bundle.adapt(BundleWiring.class).getClassLoader()
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();
- 1. Errore di equinozio (manca il pacchetto console)
- 2. Come ottenere classpath da classloader?
- 3. Come si "chiude" un ClassLoader?
- 4. Scaricare un classloader
- 5. lanciato attraverso il classloader?
- 6. Ottenere un elenco di tutti i classloader in una JVM
- 7. Il modo migliore per arrestare un contenitore OSGi (in particolare equinozio)
- 8. C'è un modo per forzare un classloader a caricare un pacchetto anche se nessuna delle sue classi è stata caricata?
- 9. android, come ottenere il nome del pacchetto?
- 10. Come utilizzare ClassLoader personalizzato?
- 11. .dll già caricato in un altro classloader?
- 12. Che cos'è un classloader isolato in Java?
- 13. Caricamento di ogni classe in un pacchetto
- 14. Ottenere un file di directory e ClassLoader per un gioco libGDX Android
- 15. Come posso ottenere il nome del pacchetto in Android?
- 16. Crea nuovo ClassLoader per ricaricare Classe
- 17. Come ottenere il nome di una classe senza il pacchetto?
- 18. Change classloader
- 19. Come ottenere tutti i nomi delle classi in un pacchetto?
- 20. utente ClassLoader definite in C#
- 21. Come si calcolano i momenti di equinozio/solstizio?
- 22. Come configurare il logback per il pacchetto?
- 23. Ottenere antonimi usando il pacchetto R Wordnet
- 24. Eclipselink: come si ottiene EntityManager in ogni pacchetto?
- 25. Caricamento di un array con un classloader
- 26. Come ottenere un percorso per una risorsa in un file JAR Java
- 27. JavaCompiler con ClassLoader e FileManager personalizzati
- 28. quale pacchetto cygwin per ottenere il comando `parallelo`?
- 29. C'è un modo per ottenere il bytecode per una classe in fase di esecuzione?
- 30. Come mostrare il pacchetto explorer in eclissi?
Ma poi si ha un problema di bootstrap. Come ottieni quella prima istanza? – Geniedesalpages
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. –
Il caricamento della classe J2SE non è adatto per J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan