Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "BundleProxyClassLoader recipe"
(Updating to support parent classloaders) |
|||
Line 7: | Line 7: | ||
public class BundleProxyClassLoader extends ClassLoader { | public class BundleProxyClassLoader extends ClassLoader { | ||
− | |||
private Bundle bundle; | private Bundle bundle; | ||
− | + | private ClassLoader parent; | |
+ | |||
public BundleProxyClassLoader(Bundle bundle) { | public BundleProxyClassLoader(Bundle bundle) { | ||
+ | this.bundle = bundle; | ||
+ | } | ||
+ | |||
+ | public BundleProxyClassLoader(Bundle bundle, ClassLoader parent) { | ||
+ | super(parent); | ||
+ | this.parent = parent; | ||
this.bundle = bundle; | this.bundle = bundle; | ||
} | } | ||
Line 25: | Line 31: | ||
} | } | ||
− | public URL | + | public URL findResource(String name) { |
return bundle.getResource(name); | return bundle.getResource(name); | ||
} | } | ||
− | public Class | + | public Class findClass(String name) throws ClassNotFoundException { |
return bundle.loadClass(name); | return bundle.loadClass(name); | ||
+ | } | ||
+ | |||
+ | public URL getResource(String name) { | ||
+ | return (parent == null) ? findResource(name) : super.getResource(name); | ||
+ | } | ||
+ | |||
+ | public Class loadClass(String name) throws ClassNotFoundException { | ||
+ | return (parent == null) ? findClass(name) : super.loadClass(name); | ||
} | } | ||
} | } | ||
</pre> | </pre> |
Revision as of 17:09, 12 June 2006
import java.io.IOException; import java.net.URL; import java.util.Enumeration; import org.osgi.framework.Bundle; public class BundleProxyClassLoader extends ClassLoader { private Bundle bundle; private ClassLoader parent; public BundleProxyClassLoader(Bundle bundle) { this.bundle = bundle; } public BundleProxyClassLoader(Bundle bundle, ClassLoader parent) { super(parent); this.parent = parent; this.bundle = bundle; } // Note: Both ClassLoader.getResources(...) and bundle.getResources(...) consult // the boot classloader. As a result, BundleProxyClassLoader.getResources(...) // might return duplicate results from the boot classloader. Prior to Java 5 // Classloader.getResources was marked final. If your target environment requires // at least Java 5 you can prevent the occurence of duplicate boot classloader // resources by overriding ClassLoader.getResources(...) instead of // ClassLoader.findResources(...). public Enumeration findResources(String name) throws IOException { return bundle.getResources(name); } public URL findResource(String name) { return bundle.getResource(name); } public Class findClass(String name) throws ClassNotFoundException { return bundle.loadClass(name); } public URL getResource(String name) { return (parent == null) ? findResource(name) : super.getResource(name); } public Class loadClass(String name) throws ClassNotFoundException { return (parent == null) ? findClass(name) : super.loadClass(name); } }