簡體   English   中英

當Java類具有項目依賴性時,如何通過編程方式從源代碼中編譯和實例化Java類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM