博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】获取OSGi任意Bundle的ClassLoader
阅读量:6222 次
发布时间:2019-06-21

本文共 1883 字,大约阅读时间需要 6 分钟。

在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

代码如下:

1     public static ClassLoader getBundleClassLoader(Bundle bundle) { 2         // 搜索Bundle中所有的class文件 3         Enumeration
classFileEntries = bundle.findEntries("/", "*.class", 4 true); 5 if (classFileEntries == null || !classFileEntries.hasMoreElements()) { 6 throw new RuntimeException(String.format("Bundle[%s]中没有一个Java类!", 7 bundle.getSymbolicName())); 8 } 9 // 得到其中的一个类文件的URL10 URL url = classFileEntries.nextElement();11 // 得到路径信息12 String bundleOneClassName = url.getPath();13 // 将"/"替换为".",得到类名称14 bundleOneClassName = bundleOneClassName.replace("/", ".").substring(0,15 bundleOneClassName.lastIndexOf("."));16 // 如果类名以"."开头,则移除这个点17 while (bundleOneClassName.startsWith(".")) {18 bundleOneClassName = bundleOneClassName.substring(1);19 }20 Class
bundleOneClass = null;21 try {22 // 让Bundle加载这个类23 bundleOneClass = bundle.loadClass(bundleOneClassName);24 } catch (ClassNotFoundException e) {25 throw new RuntimeException(e);26 } // 得到Bundle的ClassLoader27 return bundleOneClass.getClassLoader();28 29 }

 

转载于:https://www.cnblogs.com/remagon/p/3781842.html

你可能感兴趣的文章
云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
查看>>
超级有用的15个mysqlbinlog命令
查看>>
数据库之间转移数据
查看>>
PHP连接Mysql常用API(mysql,mysqli,pdo)区别与联系
查看>>
java中的CAS
查看>>
简单的markdown在线解析服务
查看>>
Linux基础(day44)
查看>>
Git 分支创建及使用
查看>>
MariaDB安装, Apache安装
查看>>
多线程三分钟就可以入个门了!
查看>>
从道法术三个层面理解区块链:术
查看>>
elasticsearch入门使用
查看>>
数据结构与算法4
查看>>
tomcat去掉项目名称
查看>>
微服务架构的优势与不足(一)
查看>>
分布式服务治理框架Dubbo
查看>>
小程序好的ui框架选择
查看>>
今天学习了
查看>>
Tomcat安装、配置、优化及负载均衡详解
查看>>
虹软人脸识别SDK(java+linux/window) 初试
查看>>