Core aplikacji wczytuje ze wskazanego miejsca wtyczki, ktore skompilowane sa do postaci biblioteki .jar. Do obslugi tych wtyczek, posiada interfejs IPlugin i kazda wtyczka implementuje ten interfejs.
Wtyczka A implementuje interfejsy: IPlugin, IA
Wtyczka B implementuje interfejsy: IPlugin, IB, posiada interfejs IA
Core wszystkim wtyczkom poprzez funkcje init() przekazuje mape wtyczek (LinkedHashMap<String, IPlugin>). Core nie zna interfejsow IA, iB.
Wtyczka B chce skorzystac z funkcji wtyczki A. Majac mape wtyczek, pobieramy sobie odpowiednia wtyczke poprzez: mapa.get("A"). Otrzymujemy wiec obiekt typu IPlugin. z niego wydobywamy instancje obiektu-wtyczki: mapa.get("A").getInstance(). Interfejs IPlugin posiada funkcje getInstance. Nastepnie to, co otrzymalem, mam zapisane w obiekcie o nazwie a. Nastepnie, jako ze wtyczka B ma interfejs IA, rzutuje otrzymana instancje obiektu: IA.class.cast(a). Chcialbym nastepnie wywolac jakas funkcje z klasy a, powiedzmy test(), wiec moge napisac IA.class.cast(a).test();
Problem: ClassCastException podczas wywolania IA.class.cast(a). Problem znika, jesli Core posiada interfejs IA. Niestety w Core nie moge umieszczac interfejsow wtyczek, jedynie IPlugin i jedynie z nim Core moze byc skompilowane do pliku .jar. Wtyczka A w swoim pliku .jar posiada interfejs IA, wtyczka B posiada w swoim pliku .jar interfejs IB i IA, aby mogla korzystac z funkcji wtyczki A.
Ogolniej: calosc polega na tym, by zaimplementowac taki system obslugi wtyczek, by wtyczki mogly komunikowac sie miedzy sobie przy pomocy odpowiednich interfejsow, jednak Core nie moze posiadac zadnego z tych interfejsow, poniewaz nie wie, jakie wtyczki powstana.
Nie wiem, czy jest to dobry sposob implementacji systemu wtyczek, ktore maja sie miedzy soba komunikowac, czy tak to sie fachowo rozwiazuje. W Sieci znalazlem jakis przyklad, w ktorym wczytywane sa wszystkie klasy znajdujace sie w pliku .jar wtyczki, jednak to nie rozwiazuje problemu. Core wydaje sie potrzebowac interfejsu IA w tej sytuacji, jednak nie jest on dostarczany wraz z Core, natomiast jest dostarczany wraz z wtyczka A.jar oraz B.jar. Mimo wszystko jednak Core tego interfejsu nie widzi. Byc moze cos pominalem. A byc moze tego typu obsluge wtyczek nalezy zaimplementowac w zupelnie inny sposob.
Mam nadzieje, ze wszystko opisalem dostatecznie jasno i, ze znajdzie sie ktos, kto bedzie mogl udzielic mi odpowiedzi.