Przeczytałem dużo kodu równonocy, ale nadal nie mogę znaleźć sposobu, aby pobrać program ładujący klasy dla pakietu osgi w konfiguracji eclipse equinox. Czy jest jeden?Jak uzyskać klasyloader dla pakietu w równonoc?
13
A
Odpowiedz
10
Krótka odpowiedź (z pewnością dla OSGi 4.1, nie jestem pewien 4.2), nie można pobrać programu ładującego klasy pakietu. Jednak interfejs Bundle
udostępnia metodę loadClass()
, dzięki czemu można napisać moduł ładujący klasy, który otacza interfejs API pakietu i deleguje do tej metody loadClass()
. Możesz też zaoszczędzić trochę czasu i skorzystać z klasy Spring DM BundleDelegatingClassLoader
.
1
W normalnym kodu java, można uzyskać ładującego klasy, które załadowane dany obiekt z
object.getClass().getClassLoader();
lub nawet tylko
SomeType.class.getClassLoader();
To samo odnosi się do równonocy, wystarczy użyć obiektu lub typ pochodzi z pakietu, który cię interesuje.
31
W OSGi 4.3 możesz użyć:
bundle.adapt(BundleWiring.class).getClassLoader()
4
Program ładujący klasy pakietu można uzyskać za pośrednictwem interfejsu BundleWiring. Oto krótki przykład:
Bundle bundle = bundleContext.getBundle();
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
ClassLoader classLoader = bundleWiring.getClassLoader();
Ale wtedy masz problem z bootstrapem. Jak zdobyć pierwszą instancję? – Geniedesalpages
Jeśli masz zależność od innego pakietu, możesz odwołać się do innej klasy bezpośrednio (SomeType.class), którą programy klasy osgi delegują między pakietami, aby nadal pochodziły one z innego programu ładującego klasy. Jeśli nie masz zależności, musisz pobrać obiekt Bundle (za pomocą programu PackageAdmin) i użyć pakietu # loadClass, jak wspomniano w drugiej odpowiedzi. –
Ładowanie klasy J2SE nie pasuje do J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan