[英]How to load a class by classname string from OSGi runtime environment?
我正在制作一個插件來插入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.
所以這是我的問題:我只有我的bundle的類加載器,如何獲得OSGi容器類加載器,我可以從整個OSGi容器中按名稱加載類? (我希望當OSGi啟動時,它會將所有bundle和所有類加載到內存中,如果OSGi容器類加載器確實存在且能夠加載任何類,則可以加載它們)
誰知道怎么做這個工作? 示例代碼非常受歡迎。
我可以看到兩種可能對你有幫助的情況。
您可以添加類似的語句
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;
}
在OSGi中,沒有確定的方法只能通過其完全限定的類名來命名類。 原因是兩個包可以以不同的方式定義相同的類名。 例如,如果bundle A需要lib v1.0而bundle B需要版本2.0中的相同lib,那么這很重要。
如果您也知道捆綁包,則可以命名一個類。 所以你可以從(Bundle bundle,String fqClassname)解析一個類
您可以使用BundleContext實現此功能。 從捆綁上下文中,您可以列出捆綁包,並為每個捆綁包添加類。
當然,您也可以簡單地遍歷所有類加載器並嘗試按名稱查找類。 問題是它不必是唯一的。 因為你可以在你的情況下打印一個可能沒問題的警告。
所以你需要的關鍵API方法是:Bundle [] BundleContext.getBundles()Class Bundle.loadClass()
我不完全確定你要做什么,但假設你正在構建一個工具,需要在安裝在OSGi框架中的所有應用程序包上進行某種形式的處理,你可能想要考慮OSGi Extender模式
我想你的bundle的清單中有一個import指令來獲取你需要的包。如果已經完成,那么你要查找的所有類應該是你的類加載器的一部分,並且按名稱加載一個類應該有用。
那么,你確定在捆綁中的META-INF / MANIFEST.MF中有這樣的東西:
Import-Package: foo.bar.com;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.