2014-07-09 40 views
3

我無法獲取缺少/未使用特定依賴項的對象的聲明字段。Java getDeclared具有缺失依賴項的類的字段

Field[] fields = OBJECT.getClass().getDeclaredFields(); 

當該對象已導入缺少的類時拋出NoClassDefFoundError

我想這樣做的原因是Bukkit插件。我想獲取缺少依賴項的插件實例的字段(它們不被使用,但插件可以啓動)。

在運行時,插件會檢查是否存在所需的依賴關係,並依賴於它將加載這些特定的字段。

我想到的可能的解決方案:
1)實際上創建丟失的類+包並使用ASM再次嘗試。但我真的不知道該怎麼做。

問候,
馬克西姆

+0

假設你正在編寫這個插件,爲什麼不擺脫冗餘導入? – JamesB

+0

我不寫插件我想獲得的領域,所以我不能修改它們。 – Maximvdw

+0

bump(); //任何人有答案? – Maximvdw

回答

0

爲什麼你應該關心的領域,而缺少的依賴?

如果發生這種情況,類不應該在運行時有實例。我不認爲JRE將允許爲它的字段創建缺少類的對象的實例。

如果你閱讀getDeclaredMethods,這可能意味着什麼。 ASM/BCEL是一個很好的方向,但不能虛擬地創建缺失的類(因爲你不知道他們是誰)。ASM/BCEL是一個很好的方向,但不能虛擬地創建缺失的類(因爲你不知道他們是誰)。你用它們來讀/解析「類文件」來解碼它的簽名(即getDeclaredFields而不使用類加載器)。

+0

我不想加載/獲取它們。我想要加載的插件有引用引用的字段(private PluginB pluginb;) 在運行時,該插件將加載該依賴關係(如果存在)。 使用「getDeclaredFields」時出現noclassdeffound錯誤 – Maximvdw

0

首先要確保,你的目標插件插件之前加載: 你可能會迫使它你的插件之前加載,添加這一行到您的plugin.yml文件:

softdepend:插件名稱]

其中Pluginname是您的反射目標插件。 其次,你應該只得到田野,你從這個插件需要,沒有列出每個領域,但如果你想獲得它的所有領域,不僅僅是反編譯它的代碼,使自定義字段getter方法:

public ArrayList<Field> getFields(Class cl,String... analyze){ 
    ArrayList<Field> fields=new ArrayList<Field>(); 
    for (String f:analyze){ 
     try{ 
      Field field=cl.getDeclaredField(f); 
      field.setAccessible(true); 
      fields.add(field); 
     } catch (Throwable err){ 
     } 
    } 
}