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