当前位置: 首页 > 知识库问答 >
问题:

如何从OSGi运行时环境中按类名字符串加载类?

杭昊空
2023-03-14

我正在制作一个捆绑包,插入OSGi,为用户提供一个功能:

Usercase: User input the classname string and click "list" button, the corresponding class will be decompiled and show the text on GUI for user.

所以这是我的问题:我只有我的包的类加载器,我如何才能得到OSGi容器类加载器,我可以从整个OSGi容器中按名称加载类?(我希望当OSGi启动时,它会加载所有的包和所有的类到内存中,任何类都可以被OSGi容器类加载器加载,如果它真的存在并且能够)

有人知道怎么做这项工作吗?高度赞赏示例代码。

共有3个答案

戚学文
2023-03-14

我不完全确定您正在尝试做什么,但是假设您正在构建一个工具,该工具在安装在OSGi框架中时需要对所有应用程序包进行某种形式的处理,您可能需要考虑OSGi扩展器模式

  • OSGi Extender模型,作者:Peter Kriens
萧懿轩
2023-03-14

在OSGi中,只有完全限定的类名才能确定类的名称。原因是两个bundle可以以不同的方式定义相同的类名。例如,如果捆绑包A需要1.0版的lib,而捆绑包B在2.0版中需要相同的lib,这一点很重要。

但是,如果您也知道包,则可以命名一个类。因此,您可以从(Bundle bundle, String fqClassname)解析一个类

您可以通过使用BundleContext来实现这一点。从bundle上下文中,您可以列出bundle,并且可以为每个bundle加载一个类。

当然,您也可以简单地遍历所有这些类加载器并尝试按名称查找类。问题是它不必是唯一的。因为您可以在您的情况下打印警告,这可能没问题。

因此,您需要的关键API方法是:Bundle[]BundleContext。getBundles()类Bundle。loadClass()

董法
2023-03-14

我可以看到两种可能的情况可以帮助你。

您可以添加如下语句

DynamicImport-Package: *

到您的清单,然后尝试使用

Class.forName("com.company.class");

如果你真的需要找到每一个可用的类,我不知道你为什么想要这个,但是你可以试着问每个包是否“知道”一个给定的类。由于在这种情况下,最终可能会有多个同名的类,因此您需要选择正确的类。

你可以这样做

private List<Class<?>> findClass(BundleContext context, String name) {
    List<Class<?>> result = new ArrayList<Class<?>>();
    for (Bundle b : context.getBundles()) {
        try {
            Class<?> c = b.loadClass(name);
            result.add(c);
        } catch (ClassNotFoundException e) {
            // No problem, this bundle doesn't have the class
        }
    }
    return result;
}
 类似资料:
  • 我正在开发一个具有多个模块的基于Eclipse3.7RCP的应用程序。模块A是一系列库,包括MyBatis-3.2.2.jar。模块B依赖于模块A(manifest.mf中的Require-Bundle),并具有使用MyBatis访问数据库中数据的代码。我在模块B中导出了带有映射器类和XML的包,并在模块A中导入了它们。我正在代码中构建SqlSessionFactory,如果我按名称添加所有映射器

  • 问题内容: 我在字符串中有一个完整的XML文档,想要一个对象。Google会产生各种垃圾。什么是最简单的解决方案?(在Java 1.5中) 解决方案 感谢Matt McMinn,我决定完成此实现。对我来说,它具有适当级别的输入灵活性和异常粒度。(很高兴知道错误是来自格式错误的XML-还是来自错误的IO- 。) 问题答案: 在Java 1.5中,这对我有效-我去除了一些特殊的可读性。

  • 问题内容: 相反,如果不从文件加载xml,如何从字符串加载呢? 问题答案: 您的XML字符串在哪里。有关更多信息,请参见MSDN文章。

  • 我正在尝试制作一个Java工具,它将扫描Java应用程序的结构,并提供一些有意义的信息。要做到这一点,我需要能够扫描所有的。从项目位置(JAR/WAR或只是一个文件夹)初始化文件,并使用反射来阅读它们的方法。事实证明,这几乎是不可能的。 我可以找到许多基于URLClassloader的解决方案,它们允许我从目录/归档中加载特定的类,但没有一种解决方案允许我在不知道类名或包结构的情况下加载类。 编辑

  • 我有以下公钥,它以文本形式存储在数据库(PostgresSQL)中。它是java中的字符串: 我不知道这个密钥是如何生成的,对不起。我被告知要使用这个密钥并验证另一个我称之为“对象”的字符串的签名。我被告知我必须使用的验证“对象”的算法是SHA256with RSA。 所以,我写了下面的java方法来读取密钥 重点是我得到了以下例外: JAVA安全InvalidKeyException:IOExc

  • AST或字节码的解释过程只是在代码过程层面,不足以成为一个完整的运行,因为程序计算是需要数据和存储空间的,光有代码跑不起来,需要运行时环境,至少要有数据,实际情况中还需要一些其他信息。为讨论方便,在解释器中将运行时环境抽象为前述的env对象,通过一些接口来实现存取,这里先只讨论单执行序列,不考虑并发 env在前面的分析中总共就涉及了三个接口,get,set和set_exception(当然还应该有