一种获取OSGi任意Bundle的ClassLoader的方法

一种获取OSGi任意Bundle的ClassLoader的方法

在OSGi环境中,在Bundle内部代码中要得到自己Bundle的ClassLoader就很简单,在自己Bundle的代码中,免备案空间,直接写this.getClass().getClassLoader()就得到了自己Bundle的ClassLoader了。但怎么在其他Bundle或外部代码中得到任意一个Bundle的ClassLoader呢?Bundle和BundleContext都没有提供getClassLoader方法来获取,我就用了一种比较另类的方法来获取。突破口就在Bundle.loadClass(String className)方法,目前此方法已经在QuickWebFramework中应用了。

思路:

1.调用Bundle的findEntries方法,得到Bundle中任意一个class文件。

2.根据这个class文件的路径,服务器空间,得到类名

3.调用Bundle的loadClass方法,得到这个类

4.调用这个类的getClassLoader方法,得到ClassLoader

PS:

1.由上面的思路可知此方法不能用于没有一个Java类的Bundle

2.OSGi系统Bundle(即ID为0的Bundle)得不到class文件,香港服务器租用,所以此方法不能用于OSGi系统Bundle

代码如下:

import java.net.URL;import java.util.Enumeration;import org.osgi.framework.Bundle;/** * 插件辅助类 * 作者博客: * @author aaa * BundleUtils {/*** 得到Bundle的类加载器** @param bundle* ClassLoader getBundleClassLoader(Bundle bundle) {// 搜索Bundle中所有的class文件Enumeration<URL> classFileEntries = bundle.findEntries(“/”, “*.class”,true);if (classFileEntries == null || !classFileEntries.hasMoreElements()) {throw new RuntimeException(String.format(“Bundle[%s]中没有一个Java类!”,bundle.getSymbolicName()));}// 得到其中的一个类文件的URLURL url = classFileEntries.nextElement();// 得到路径信息String bundleOneClassName = url.getPath();// 将”/”替换为”.”,得到类名称bundleOneClassName = bundleOneClassName.replace(“/”, “.”).substring(0,bundleOneClassName.lastIndexOf(“.”));(bundleOneClassName.startsWith(“.”)) {bundleOneClassName = bundleOneClassName.substring(1);}Class<?> bundleOneClass = null;try {// 让Bundle加载这个类bundleOneClass = bundle.loadClass(bundleOneClassName);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} bundleOneClass.getClassLoader();}}

posted on

不论你在什么时候开始,重要的是开始之後就不要停止

一种获取OSGi任意Bundle的ClassLoader的方法

相关文章:

你感兴趣的文章:

标签云: