classloading and type visibility in osgi€¦ · class aclass a b.jarb.jar class bclass b parent...
TRANSCRIPT
![Page 1: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/1.jpg)
© 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license | April 23rd, 2008
Classloading and Type Visibility in OSGi
Martin Lippertakquinet it-agile GmbH
![Page 2: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/2.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Overview
• Introduction to classloadingWhat is classloading?How does classloading work?What does classloading mean for daily development?
• Classloading in OSGiWhat is different?Dependency and VisibilityAdvanced Classloading in OSGi
• Conclusions
![Page 3: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/3.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
What is Classloading?
• Classloaders are Java objects• They are responsible for loading classes into the VM
Every class is loaded by a classloader into the VMThere is no way around
• Every class has a reference to its classloader objectmyObject.getClass().getClassLoader()
![Page 4: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/4.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader APIpublic abstract class ClassLoader {
public Class<?> loadClass(String name)
public URL getResource(String name)public Enumeration<URL> getResources(String name)public InputStream getResourceAsStream(String name)
public final ClassLoader getParent()
public static URL getSystemResource(String name)public static Enumeration<URL> getSystemResources(String name)public static InputStream getSystemResourceAsStream(String name)public static ClassLoader getSystemClassLoader()
...}
![Page 5: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/5.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Implicit class loading
public class A {public void foo() {
B b = new B();b.sayHello();
}}
causes the VM to load class B using the classloader of A
![Page 6: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/6.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Explicit class loading
public void foo() {ClassLoader cl =
this.getClass().getClassLoader();Class<?> clazz = cl.loadClass("A");Object obj = clazz.newInstance();
...}
![Page 7: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/7.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Hierarchical classloaders
• Classloaders typically have a parent classloaderChained classloading
• If a classloader is invoked to load a class, it first calls the parent classloader
Parent first strategyThis helps to prevent loading the same class multiple times
![Page 8: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/8.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader hierarchy
Classloader AClassloader A
Classloader BClassloader B
A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
parent
loaderB.loadClass("A");
![Page 9: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/9.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type compatibility
Classloader AClassloader A
Classloader BClassloader B
A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
parentloaderA.loadClass("A");
Returns the same class object as loaderB.loadClass("A")Returns the same class object as loaderB.loadClass("A")
![Page 10: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/10.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader AClassloader A
Classloader BClassloader B
A.jarA.jar
Class AClass A
A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
B.jarB.jar
Class BClass B
parent
loaderB.loadClass("A");
Defining vs. Initiating classloader
Initiating loader
Defining loader
![Page 11: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/11.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type compatibility II
Classloader AClassloader A A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
parent
Classloader B2Classloader B2B.jarB.jar
Class BClass B
parent
Classloader B1Classloader B1
loaderB1.loadClass(“A”) == loaderB2.loadClass(“A”)loaderB1.loadClass(“B”) != loaderB2.loadClass(“B”)
![Page 12: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/12.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type compatibility III
Classloader AClassloader A A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
parent
Classloader B2Classloader B2B.jarB.jar
Class BClass B
parent
Classloader B1Classloader B1
Object b1 = loaderB1.loadClass(“B”).newInstance();
b1 !instanceof loaderB2.loadClass(“B”)
Remember: A class is identified by its name (including the package name) AND its defining class loader !!!
Remember: A class is identified by its name (including the package name) AND its defining class loader !!!
![Page 13: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/13.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type compatibility IV
Classloader AClassloader A A.jarA.jar
Class AClass A
B.jarB.jar
Class BClass B
parent
Classloader B2Classloader B2B.jarB.jar
Class BClass B
parent
Classloader B1Classloader B1
public interface A {}public interface A {}
public class B implements A {}public class B implements A {}
A anA = loaderB1.loadClass(“B”).newInstance();A anotherA = loaderB2.loadClass(“B”).newInstance();anA = anotherA; (Assignment)
![Page 14: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/14.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
The default setting
Bootstrap ClassloaderBootstrap Classloader
Extension ClassloaderExtension Classloader
System ClassloaderSystem Classloader
loads JVM classes (rt.jar)
loads classes from the JRE ext folder
loads classes from your application classpath
![Page 15: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/15.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Threads context classloaderThread.currentThread().getContextClassLoader()Thread.currentThread().setContextClassLoader(..)
• Typically used in libraries to access the context in which the library is called
![Page 16: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/16.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader.loadClass vs. Class.forName
•Classloader.loadClass() caches the loaded class object and returns always the same class object
This is done by the defining classloaderThis ensures that each classloader loads the same class only once
•Class.forName() calls the normal classloader hierarchy to load the class (same happens as above)
But caches the class object within the initiating classloaderIn standard cases no problem but can be tricky in dynamic environments
![Page 17: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/17.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloading is dynamic
• You can create classloaders at runtime• You can trigger them to load a specific class
• For example:What app/web servers do for hot deployment
• Some people say the classloading mechanism is the only real innovation in the Java programming language
![Page 18: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/18.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloading in OSGi
• “OSGi is a classloading framework”
• Remember:Dependencies between bundles
Import- and Export-Package, Require-BundleDynamic Bundle Lifecycle
Install, Update, Uninstall bundles
• Realized via specialized classloading
![Page 19: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/19.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader per bundle
• One classloader per bundleControls what is visible from the bundleControls what is visible from other bundles
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
ClassloaderClassloader
ClassloaderClassloader
Bundle CBundle C
Class CClass CClassloaderClassloader
![Page 20: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/20.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloader per bundle
• EffectsNo linear class path for your application anymoreInstead class path per bundleNo real parent hierarchy anymore
• Classloader parent settingDefault: Bootstrap classloaderCan be parameterized via system property
![Page 21: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/21.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Dependencies via delegation
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Bundle CBundle C
Class CClass C
Export-Package: mypackageAExport-Package: mypackageA
Export-Package: mypackageCImport-Package: mypackageAExport-Package: mypackageCImport-Package: mypackageA
Import-Package: mypackageAImport-Package: mypackageCImport-Package: mypackageAImport-Package: mypackageC
![Page 22: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/22.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Visibility I
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Export-Package: mypackageAExport-Package: mypackageA
Import-Package: mypackageAImport-Package: mypackageA
A anA = new A();
A anA = new A();
class A is loaded only once by bundle A (the bundles
classloader)
class A is loaded only once by bundle A (the bundles
classloader)class A is loaded only once by
bundle A (its classloader)class A is loaded only once by
bundle A (its classloader)
![Page 23: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/23.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Visibility II
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Export-Package: mypackageAExport-Package: mypackageA
Import-Package: mypackageAImport-Package: mypackageA
A anA = new A();
A anA = new A();
class is loaded successfully
class is loaded successfully
bundle B remains in state “installed” (not resolved)bundle B remains in state “installed” (not resolved)
![Page 24: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/24.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Visibility III
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Export-Package: mypackageAExport-Package: mypackageA
Import-Package: mypackageAImport-Package: mypackageA
A anA = new A();
A anA = new A();
class is loaded successfully
class is loaded successfully
ClassNotFoundExceptionClassNotFoundException
![Page 25: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/25.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Compatibility revisited I
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Export-Package: mypackageAExport-Package: mypackageA
Import-Package: mypackageAImport-Package: mypackageA
A anotherA = new A();
A anA = new A();
exactly the same typeexactly the same typeexactly the same typeexactly the same type
![Page 26: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/26.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Compatibility revisited II
Bundle ABundle A
Class AClass A
Bundle BBundle B
Class BClass B
Export-Package:mypackageA;version="1.0.0"Export-Package:mypackageA;version="1.0.0"
Import-Package:mypackageA;version=“1.0.0"Import-Package:mypackageA;version=“1.0.0"
A anA = new A();
Bundle ABundle A
Class AClass A
Bundle CBundle C
Class CClass C
Export-Package:mypackageA;version=“2.0.0"Export-Package:mypackageA;version=“2.0.0"
Import-Package:mypackageA;version=“2.0.0"Import-Package:mypackageA;version=“2.0.0"
A anA = new A();
Completely different and incompatible typesCompletely different and incompatible typesCompletely different and incompatible typesCompletely different and incompatible types
![Page 27: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/27.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Type Compatibility revisited IIIBundle ABundle A
Type AType A
Bundle CBundle C
Class CClass C
Bundle BBundle B
Class BClass B public class B impl A {}public class B impl A {}
public class C impl A {}public class C impl A {}
public interface A {}public interface A {}
Bundle DBundle D
Class DClass DA myA = createServiceA();
Static type of myA is A, dynamic type of myA could be B or C
Static type of myA is A, dynamic type of myA could be B or C
![Page 28: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/28.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
ClassNotFoundException
• Typical reasons for a ClassNotFoundException:Dependency to declaring bundle not definedType is not visible (not exported)
• Dynamically generated classesProxiesCGLib…
![Page 29: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/29.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Buddy loading I
• What happens if a library needs to load classes from its clients?
e.g. persistence libraries?
• Cyclic dependencies are not allowed and maybe even not what you want
• Equinox provides so called “Buddy Loading”
![Page 30: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/30.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Buddy loading II
org.hibernateBundle
org.hibernateBundle
Bundle ABundle A
Class AClass A
Eclipse-BuddyPolicy: registeredEclipse-BuddyPolicy: registered
Eclipse-RegisterBuddy:org.hibernate
Eclipse-RegisterBuddy:org.hibernate
A anA = new A();
Allows org.hibernate bundle to execute successfullyloadClass(“A”)
Allows org.hibernate bundle to execute successfullyloadClass(“A”)
Allows org.hibernate bundle to execute successfullyloadClass(“A”)
Allows org.hibernate bundle to execute successfullyloadClass(“A”)
![Page 31: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/31.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Buddy loading III
• Important difference:Buddy loading can load all classes from a buddy bundlenot only exported types
• Its just a workaround for libraries and other existing code that does not behave correctly within the OSGi world
![Page 32: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/32.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
The loading sequence
1. Try the parent for “java.” packages2. Try the parent for boot delegation packages 3. Try to find it from imported packages4. Try to find it from required bundles5. Try to find it from its own class path6. Try to find it from dynamic import7. Try to find it via buddy loading
![Page 33: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/33.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
“High Performance Classloading”
• Classloading consumes a remarkable amount of time at startup
• OSGi allows to highly optimize classloadingFinding the right classHighly optimized implementations available
![Page 34: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/34.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Classloading Hooks
• Equinox provides a hook mechanismTo enhance and modify the behavior of the runtime
• ExamplesModify bytecode at load-timeIntercept bundle data access
• Eat your own dog foodSome Equinox features are implemented using those hookse.g. Eclipse-LazyStart
![Page 35: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/35.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Garbage Collection for Classloaders
• You could expect that the classloader of a bundle gets garbage collected if the bundle is stopped or uninstalled
• This is not automatically the case!!!
• You need to ensure that all objects from those classes loaded by this classloader are no longer referenced
![Page 36: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/36.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
What does this mean?
• Bundle A provides an interface I and a registry for objects of type I
• Bundle X has a class Y that implements I, creates objects of type Y and registers those objects at the registry
• If you uninstall X, you need to cut the references that still exists in the registry of A.
![Page 37: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/37.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Conclusions
• Changing the viewpoint from the linear classpath to a per-bundle classpath
• Clearly defined dependencies and visibilitiesReal modularityClassloading only implementation detail
• Use OSGi in a clean and correct way and you never need to think about classloading at all
![Page 38: Classloading and Type Visibility in OSGi€¦ · Class AClass A B.jarB.jar Class BClass B parent Classloader B2Classloader B2 B.jarB.jar Class BClass B parent Classloader B1Classloader](https://reader034.vdocuments.net/reader034/viewer/2022052104/603ea15c1101ee4490615ac6/html5/thumbnails/38.jpg)
Classloading and Type Visibility in OSGi | © 2008 by Martin Lippert; made available under Creative Commons Att. Nc Nd 2.5 license
Thank you for your attention!
Q&A
Martin Lippert: [email protected]