我正在考虑修改现有的java框架以使用OSGi。我有几个依赖反射的组件,并且可以与任何类型的类(如bean和持久性服务)一起工作。 我对OSGi还不是很有经验,但据我了解,OSGi包只能看到它明确导入的包中的类。如果我用maven-bundle-plugin构建一个包,并指定通配符作为导入包,它将解析构建时由代码引用的包。我需要代码来处理构建时未知的包中的类。使用maven构建基于反射的OSGi服务
我想要实现的是,bundle-A可以使用bundle-B中的持久性框架来保存属于bundle-C的类。虽然bundle-B在构建时不知道bundle-C。
我需要什么样的清单条目以及如何使用maven-bundle-plugin来设置它们?
此外,由于可以有多个版本的相同的类使用不同的捆绑包,这甚至在OSGi环境中有意义吗?如果我理解正确,Bundle-A和Bundle-B可能会看到Bundle-C的不同组合。如果Bundle-A现在将位于Bundle-C中的类的对象传递给Bundle-B,Bundle-B然后使用该类上的反射,则Bundle-B将按照其在Bundle-C中定义的类或者在Bundle-C中定义的类Bundle-A的Bundle-C。 例如,如果我在捆绑-C以下类:
class Y {
[...]
}
class X {
Y y;
[...]
}
捆绑-C是用于捆绑-A不同和B B通过类X的一个目的是A.如果B现在发现领域ÿ并解决它的类是否会解析Y,因为它是Bundle-C的版本还是A已知的版本?
简而言之,即使我有一个从所有包中导入所有类的包,这甚至可以用来创建一个服务来将对象保存到数据库中?
谢谢。因此,如果一个类由类加载器加载,则其字段的类也由相同的类加载器填充。我认为当getFields被调用时,线程的类加载器可能会延迟加载它,这会看到不同版本的字段类。我想这意味着调用newInstance将使用构造类的类加载器而不是调用者的类加载器。如果您不介意另外一个问题,我可以依赖具有不同哈希码的相同类的不同版本,还是依赖于JVM?我需要缓存每个类的DAO(-version) – user3240383
OSGi类加载不使用线程上下文类加载器。 这些字段通常由它们所在类的bunde类加载器加载..但是如果字段类位于该包之外,则此类加载器引用其他bundle类加载器。所以字段类可能有不同的类加载器。 我认为hashcodes应该是不同的,但从来没有尝试过。 –
类的标识来源于完全限定的类名和定义它的类加载器。 hashCode不会帮助你区分类。 –