[英]Sending Executable Java over a Socket
我正在使用Java進行網絡項目,我想將一些可執行代碼從節點A發送到節點B,並使節點B將執行后的代碼返回給節點A。
我嘗試執行此操作的方式(現在我知道這不適合我的用例)是定義一個名為Job的抽象類,它具有一個抽象方法run()。 看起來像這樣:
import java.io.Serializable;
public abstract class Job implements Serializable {
public String id;
public Job(String id) {
this.id = id;
}
public abstract void run();
}
然后,我打算從Job實例化子類,定義run方法,並使用內置的ObjectOutputStream
和ObjectInputStream
從Node A將派生類發送到Node B,並讓Node B在收到時簡單地調用run()方法一份工作。
但是,這超出了通過ObjectOutputStream
發送作為對象B發送的序列化對象所無法完成的工作,因為它需要從節點A發送的類的確切定義-因為每個Job都具有不同的子類型,所以它不能具有該類的定義。將對run()方法有不同的定義。
有人知道其他方法嗎? 一種將可執行代碼從節點A發送到節點B並讓節點B執行代碼的方法?
我知道我可以只創建.jars並通過OutputStream發送它們,然后讓Node B執行它們。 但是,如果有任何辦法,我可以擁有一個基類Job類,可以對其進行擴展和實例化以定義不同類型的Jobs,並將這些Jobs發送到Node B,從而做到這一點?
任何幫助或建議,將不勝感激! 提前致謝! :)
我認為您是對的-這是不可能的。 如果使用對象輸出流,則具體類的名稱是已傳輸操作的一部分; 因此,您需要在另一側定義類(因為JVM將要為傳輸的對象加載 .class文件)。 因此,.class文件必須同時存在於兩側。
除了發送.class或.jar文件並使用反射來執行相應的代碼,我看不到其他任何選擇。
編輯:但是使用反射...仍然允許您在節點A上構建不同的作業類。以有意義的方式組織您的類仍然有意義; 即使您必須先傳輸它們,然后使用反射來調用它們。
您可以通過RMI和代碼庫功能完全做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.