[英]How do I compile & instantiate a Java class from source programmatically when it has project dependencies?
很好 ,但是如果未編譯源代碼中的類應從項目特定的類(已加載)繼承並具有其他項目依賴項,該怎么辦?
例如,假設我想讓我的軟件用戶能夠在運行時自定義類。 我的項目中有一個abstract public class Customizable
和一個自定義class StatusDetails
,可以說用戶在一個看起來像這樣的文件中編寫代碼:
import com.somepackage.util.StatusDetails;
public class Test extends Customizable {
public Test(){
System.out.println("Initializing Test");
}
@Override
public StatusDetails getStatus(Object params){
StatusDetails status = new StatusDetails();
// Populate status based on params
return status;
}
}
我該如何接受並實例化它?
首先,需要編譯該類,這意味着您將必須交付所需的JAR文件並提供類路徑。 為了解決這個問題,我強烈建議使用Apache的Maven,但是學習過程會讓您有點后退。 好消息是,經過學習后,您將擁有一個非常好的構建工具,該工具完全可移植,非常適合管理Java項目。
然后,您需要將輸出的JAR文件/類放在正在運行的程序的類路徑中,然后重新啟動它。
還有其他解決方法,每種方法都有一些難度。 您可以通過使用類加載器來避免重新啟動,並讓程序響應用戶操作來動態加載類。
通過將構建鏈放入程序本身,調用編譯器工具接口,編譯程序,然后使用上述自定義類加載器將其合並到運行的程序中,可以避免構建鏈的外部化。
這種方法(如上所述)存在許多問題。 基本上,您給每個人一個巨大的安全漏洞,可供利用。 例如,我可以“加載”破壞文件系統的代碼,或打開網絡套接字以攻擊其他計算機。
我建議使用單獨的構建鏈和手動配置負載,並要求重新啟動。 它可能使用戶跳了幾圈,但它會使安全漏洞不容易被利用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.