我正在研究Java中的网络项目,我希望将一些可执行代码从Node A发送到Node B,并让Node B将执行代码的结果返回给Node 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,并且只需要节点B在收到作业时调用run()方法。
然而,这超出了通过ObjectOutputStream
发送的序列化对象可以做的事情,因为节点B需要从节点A发送的类的确切定义 - 它不能具有每个作业将具有不同的子类型,并且将具有run()方法的不同定义。
有没有人知道其他任何方法吗?一种从节点A向节点B发送可执行代码并让节点B执行代码的方法?
我知道我可能只是创建.jars并通过OutputStream发送它们,并让Node B执行它们。但是,如果我有任何方法可以通过拥有一个基本Job类来实现这一点,我可以扩展并实例化以定义不同类型的Jobs并将这些作业发送到Node B?
任何帮助或建议将不胜感激!!提前致谢! :)
答案 0 :(得分:2)
我认为你是对的 - 这是不可能的。如果使用对象输出流,则具体类的名称是已传输操作的一部分;所以你需要另一方面的类定义(因为JVM需要加载你传输的对象的.class文件)。所以.class文件需要存在于双方。
除了发送.class或.jar文件以及使用反射来执行相应的代码之外,我没有看到任何其他选项。
编辑:但是使用反射...仍然允许您在节点A上构建不同的作业类。以有意义的方式组织您的类仍然是有意义的;即使您必须先转移它们然后使用反射来调用它们。
答案 1 :(得分:2)
您可以通过RMI和代码库功能完成此操作。
答案 2 :(得分:2)