2012-10-09 221 views
0

我目前正在研究一個程序,我將在運行時動態加載類,並且正在構建一個支持它的函數庫。其中一個函數是一種方法,可以輕鬆地搜索給定的jar文件中的給定類名稱,並根據給定的初始化參數集創建新的實例。構造函數:從參數列表中獲取類型列表

問題是參數。我知道如何爲一組類類型找到類的構造函數,但是,試圖找到一個接受參數列表的構造函數更加困難。我的第一個想法是遍歷各個參數,並在每個參數上調用getClass(),但是對於一些構造函數來說,這可能是有效的空參數呢?

是否有任何明智的方法來找到給定的一組參數的正確構造函數?

注意:僅標準Java,這是一個聯合項目,因此Java派生語言和第三方庫不可用。

回答

2

你是否通過Reflection API教程?它有正是你想要的實施..

+0

此外,您可以添加有關ClassLoader –

+0

的注意事項我可以處理類加載,並在過去使用過。實際上,我打算使用動態加載的大多數功能只是使用空的構造函數,然後使用初始化函數(這是更具體的應用程序),但因爲它是我正在編寫的庫,靈活的 –

1

當您通過反射API的教程,你可以用單一的方法對您的問題

private final boolean checkConstructor(Class<?> type, Class<?>... parameterTypes) { 

     try { 
      forName.getConstructor(parameterTypes); 
      return true; 
     }catch(NoSuchMethodException e) { 

     } 

     return false; 
    } 

你必須記住的paraemterTypes的順序是非常重要的。

您不應該在需要構造函數而不知道參數類型的地方使用sytiation。同樣的規則適用於你不應該在構造函數中使用null的代碼風格。

+0

你的意思是剛剛得到的類,拒絕它,如果有空(不可解析),並試圖捕捉?我曾認爲這是我的備份解決方案,但有興趣知道是否有更優雅的解決方案。 –

0

getClass()是一種正確的方法。你必須遍歷所有可訪問的構造函數,並根據Choosing the Constructor and its Arguments的精神選擇最具體的構造函數,包括如果發現0或> 1構造函數,則拋出豁免,以及如Determine Method Signature中的裝箱/拆箱。由於空值,你不能直接實現這些算法,但應儘可能保持接近。

相關問題