簡體   English   中英

如何從OSGi運行時環境中按類名字符串加載類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM