亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法從 OSGI 包獲取類型化的類實例

無法從 OSGI 包獲取類型化的類實例

慕少森 2023-10-12 16:47:30
我有以下情況。我的應用程序中需要一個類 A 的實例,該類 A 來自捆綁包 B (osgi),位于該捆綁包中的包 X 中。到目前為止我所做的:我已將捆綁包 B 添加到本地 Maven 存儲庫,并將其作為“提供”范圍的依賴項添加到我的 pom 中。我還添加了 Bundle B 中的包 X,其中 A 類駐留在我的 pom 中,并在 pom.xml 中使用動態導入。這里需要注意一件事 - 包 X 不是從包 B 導出的,但我知道它仍然可以工作,我見過同事這樣做,但我還沒有那么好。無論如何,我如何嘗試獲取以下類的實例:Bundle bundle;Class<?> checkClass=bundle.loadClass("full path to class A");TypeOfClassA newClass=checkClass.newInstance();我在這里得到:java.lang.ClassNotFoundException ClassA not found by myapplicationat org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)在org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)但為什么 ?我已經加載了 jar,我正在使用捆綁類加載器,而且如果我將 checkClass 轉換為 Object,我可以看到 Class A 的方法和字段,所以看起來不錯,我如何獲取 A 類的實例?
查看完整描述

2 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

在 OSGi 中,編譯時和運行時之間存在差異。在編譯時,您會看到自己的 jar 的類以及來自 Maven 的所有依賴項。

在運行時,bundle 默認只看到它自己的類。任何其他包都需要清單中的 Import-Package 語句。通常,當您使用類時,bnd 會自動創建它。只要有可能,你就應該依賴這種自動性。

當然,您的情況有所不同,因為您要訪問的包不是由捆綁包 B 導出的。在這種情況下,無法通過您自己的捆綁包的捆綁包類加載器訪問類 A。

相反,您需要使用捆綁包 B 的捆綁包類加載器。例如,您可以從 BundleContext 獲取捆綁包 B。然后就可以加載類了。

另一種選擇是使用從 Bundle B 導出的類 C,并使用類 C 的類加載器來加載類 A。

無論如何,這是一個黑客行為。您應該避免使用另一個包的私有類。


查看完整回答
反對 回復 2023-10-12
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

當你編寫類似的東西 PluginA test=(PluginA) classloader.loadclass("PluginA").newInstance() 時,你需要實際導入 PluginA 類,正如 Christian 提到的,只有從它所在的包中導出它才可能。以下應該可以工作:

Object test= classloader.loadclass("PluginA").newInstance()

然后,您將需要使用反射來訪問類的方法等。


查看完整回答
反對 回復 2023-10-12
  • 2 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號