我正在考慮修改現有的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不會幫助你區分類。 –