2009-10-01 7 views

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.

+1

Ale wtedy masz problem z bootstrapem. Jak zdobyć pierwszą instancję? – Geniedesalpages

+0

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. –

+0

Ładowanie klasy J2SE nie pasuje do J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan

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();