本文介紹了如何通過類名字符串從OSGi運(yùn)行時(shí)環(huán)境加載類?的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我正在做一個(gè)包來插入OSGi,為用戶提供一個(gè)功能:
Usercase: User input the classname string and click "list" button, the corresponding class will be decompiled and show the text on GUI for user.
這就是我的問題:我只有捆綁包的類加載器,如何才能獲得OSGi容器類加載器,以便可以從整個(gè)OSGi容器按名稱加載類?(我預(yù)計(jì)當(dāng)OSGi啟動(dòng)時(shí),它會(huì)將所有包和所有類加載到內(nèi)存中,如果OSGi容器類加載器確實(shí)存在并且能夠加載任何類,它都可以加載)
有人知道怎么做這項(xiàng)工作嗎?非常感謝示例代碼。
推薦答案
我看到兩種可能對您有幫助的情況。
任何可見類
您可以添加類似
的語句
DynamicImport-Package: *
添加到您的清單中,然后嘗試使用
Class.forName("com.company.class");
所有類,無論是否導(dǎo)出
如果您確實(shí)需要查找每個(gè)可用類,我不確定您為什么要這樣做,但是您可以嘗試詢問每個(gè)包是否”知道”給定的類。由于在這種情況下,您最終可能會(huì)有多個(gè)同名的類,因此您可以選擇正確的類。
您可以這樣做
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;
}
這篇關(guān)于如何通過類名字符串從OSGi運(yùn)行時(shí)環(huán)境加載類?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,