gpt4 book ai didi

java - 使用 Maven 为 OSGi 构建基于反射的服务

转载 作者:行者123 更新时间:2023-12-01 10:15:16 24 4
gpt4 key购买 nike

我正在考虑修改现有的 java 框架以与 OSGi 配合使用。我有几个依赖反射并可与任何类型的类(如 bean 和持久性服务)配合使用的组件。我对 OSGi 还不太有经验,但据我了解,OSGi 包只能看到它显式导入的包中的类。如果我使用 maven-bundle-plugin 构建 bundle 并指定通配符作为导入包,它将解析构建时代码引用的包。我需要代码来处理构建时未知的包中的类。

我想要实现的是bundle-A可以使用bundle-B中的持久化框架来持久化属于bundle-C的类。虽然bundle-B在构建时不知道bundle-C。

我需要哪些 list 条目以及如何使用maven-bundle-plugin设置它们?

此外,由于不同的包可以使用同一类的多个版本,这在 OSGi 环境中是否有意义?如果我理解正确的话,Bundle-A 和 Bundle-B 可能会看到 Bundle-C 的不同版本。如果 Bundle-A 现在将位于 Bundle-C 中的类的对象传递给 Bundle-B,然后 Bundle-B 在该类上使用反射,则 Bundle-B 是否会看到该类,因为它是在 Bundle-C 中定义的,或者是在 bundle -A 的 bundle -C。例如,如果我在 Bundle-C 中有以下类:

class Y {
[...]
}

class X {
Y y;
[...]
}

Bundle-C 对于 Bundle-A 和 B 来说是不同的。B 将类 X 的对象传递给 A。如果 B 现在发现字段 y 并解析它的类,它将解析 Y,就像它在 Bundle-C 的版本中一样或者A已知的版本?

简而言之,即使我有一个从所有包中导入所有类的包,这对于创建一个将对象持久保存到数据库中的服务是否有用?

最佳答案

类加载的整个问题仅在加载类时才相关。反射在 OSGi 中的工作方式与在 OSGi 外部的工作方式相同。

因此,如果bundle b 中有一个方法将一个Object 作为参数。然后,您可以使用包 c 中定义的类的实例从包 A 调用此方法。即使bundle b没有导入该对象的包,它仍然可以使用反射来处理该对象。

如果您想在不导入包的包中按名称加载类,安全的方法是为其提供包含类的包的类加载器。

例如,您可以在 bundle b 中使用此方法:

public Object loadTest(ClassLoader loader, String name) {
return loader.loadClass(name);
}

现在的问题当然是如何在bundle a中获取bundle b的类加载器。最简单的方法是使用 MyClass myObject = new MyClass() 从 b 创建一个类。 Bundle a 可以在导入包时执行此操作。然后,您可以使用myObject.getClass().getClassLoader()来获取bundle b的类加载器。

在 OSGi 中,每个对象的类加载器都是定义它的包的类加载器(如果你不做任何奇怪的事情)。

如果不可能,您可以使用以下方法获取包的类加载器

ClassLoader loader = bundle.adapt(BundleWiring.class).getClassLoader();

关于java - 使用 Maven 为 OSGi 构建基于反射的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com