Ahojte,

V ramci experimentovania s OSGi som sa dostal do situacie s ClassLoaderom, z
ktorej sa neviem vymotat. Ide o to, ze kazdy Bundle v ramci OSGi ma vlastny
classloader. Ja som OSGi (konkretne Felix) embeddol do jednej svojej
aplikacie a chcel som pouzit jeden service. Problem je ten ze moja aplikacia
(dajme tomu reprezentovana jednou Main triedou) ma svoj ClassLoader a
service zase svoj. Dosledok toho je to ze ziskam referenciu na service ale
neviem ju castnut na konkretny interface.

Napriklad:

ServiceReference ref = .... //referencia na implementaciu ICommand
interface-u
Object osgiService = felix.getBundleContext().getService(ref);
ICommand command = (ICommand) osgiService; //class cast exception

Dovodom je to ze ICommand.class.getClassLoader() !=
osgiService.getClass().getClassLoader().

Mna by zaujimalo ako to riesi OSGi classloadrami? Akoto oni dokazu? Je mozne
zobrat referenciu na class z jedneho loadra a hodit ju do druheho? Skusal
som pouzit :

Thread.currentThread().setContextClassLoader(osgiService.getClass().getClassLoader());

co by malo nahradit cely classloader ale bohuzial bez uspechu.
ICommand.class.getClassLoader() stale vrati stary classloader.Priznam sa ze
zalezitosti okolo classloadra su mi trosku zahadou a chapem len ten hlavny
princip classloadra. To ci je mozne do classloadra dostat nieco ine z
druheho classloadra mi je zahadou.

Dakujem velmi pekne za kazdu radu, kazdy postreh.

Odpovedet emailem