sobota, marca 12, 2016

Spisek ClassLoader'ów ;-)

Mam taką sytuację.
Jest sobie interfejs Job, który implementuje wiele klas, klasy te są ładowane przez refleksję.

Normalnie wyglądałoby to jakoś tak:

Job job = (Job)classToLoad.newInstance();

I później można by już było pracować z job tak jak z każdą uczciwą klasą ;-)

Problemy zaczynają się wtedy gdy program, który ładuje kod ma swój ClassLoader i tworzy nowe ClassLoader'y dla ładowanych przez siebie "programów".

Wtedy ClassLoader programu głównego ładuje sobie interfejs Job, robi to też każdy z ClassLoader'ów wykonujących te Job'y....
Niestety ponieważ nie ma związku "rodzic-dziecko" między ClassLoader'ami to każdy z ClassLoader'ów ładując Job ładuje swoją własną kopię i nie da się zrzutować na Job w programie główym......

Niestety będę musiał używać nadal ohydnego wołania metod przez odbicia....

Sposoby na obejście tego problemu (sam mechanizm działania ClassLoader'ów ma sens, problemem jest raczej to jak są tutaj używane ClassLoader'y) są bardzo hacky i tricky ;-)

Można stworzyć ClassLoader, który załaduje tylko Job, i później będzie robił za rodzica dla ClassLoader'ów aplikacji głównej i reszty JAR'ów....
Można spróbować użyć serializacji... chociaż nie, bo wtedy zdeserializowany program po stronie programu głównego nie widziałby swoich klas ;-)


Podobne postybeta
Szkoła, a ja zaczynam rozumieć ClassLoader'a
Nieznane ścieżki ClassLoader'a ;-)
Czemu Writer nie jest interfejsem?
OpenOffice.org -> GoogleDocs v0.3
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)