2017-09-04 78 views
0

我一直在使用下面的代碼來加載我知道要加載的包的類。加載預先未知包的Java類

ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 

Class<?> myClass = classLoader.loadClass(classNameToBeLoaded); 

現在文件夾/包結構發生變化。

變量classNameToBeLoaded可以來自我無法預先知道的任何包,因爲類名來自用戶提供的Excel工作表。

例如,classNameToBeLoaded的值可以是從Excel文件中讀取的「Utils」,「FileValidation」等。

這個類可以來自不同的包,比如「com.iyaffle.utils」或像「com.testing.validation」或類似的東西。

當我們不知道包名時,如何讓類自動加載?

其他類似的線程不具有具體的答案:

+2

你不能。讓用戶提供包名稱。 – EJP

+0

@EJP:\t 將只有幾個軟件包將被使用,它沒有名稱相同的方法。 – Purus

+0

爲什麼不只是爲一個包調用'loadClass',並且如果調用失敗,則調用另一個包? – DodgyCodeException

回答

1

你需要知道的完全限定名來加載類,有很多類,具有相同類名稱,唯一使它們保持不同的是包名稱。

一個很好的例子是:

  • java.awt.List中
  • 的java.util.List

如果類沒有共同的方法,你需要給你打電話可以只需像現在這樣加載它們,但是要添加包名稱。

調用常用方法的最安全方法是擁有一個靜態接口或抽象類,以便您的所有動態類都可以擴展,以便您可以將動態加載的類實例視爲實現常用方法的實例。

+0

只有幾個將被使用的軟件包,它沒有名稱相同的方法。 – Purus

+1

你可以有一個從簡短的類名到完整的類名的映射,這也有助於減少攻擊面,因爲它會阻止攻擊者加載任意類,可能運行任意代碼 – jrtapsell