[英]Pass object as parameter in ProcessBuilder?
我想将两个或多个对象作为参数传递给ProcessBuilder,以将程序作为单独的进程运行。 我尝试了以下代码,但是它不起作用。
public static int exec(FTP ftp, Stage stage) throws IOException,
InterruptedException {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome +
File.separator + "bin" +
File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = Test.class.getCanonicalName();
ProcessBuilder builder = new ProcessBuilder(
javaBin, "-cp", classpath, className+" "+ftp+" "+stage);
Process process = builder.start();
process.waitFor();
return process.exitValue();
}
这是Test.class
public class Test extends Application
{
String lol = "000";
public Test(FTP ftp, Stage stage)
{
// The logic goes here for those passed parameter
System.out.println("This is Test");
}
@Override
public void start(Stage arg0) throws Exception
{
// TODO Auto-generated method stub
arg0.setTitle("Hello there");
arg0.setWidth(200);
arg0.setHeight(200);
arg0.setScene(new Scene(new Pane(new Label(lol)),1000,1000));
arg0.show();
}
}
这里Test类没有执行,但是如果我删除了这两个参数,那么只有它起作用。 有人可以告诉我如何将对象作为参数传递吗?
当您启动一个新进程时,它不会与父进程共享任何数据。 这与从命令行调用子进程相同。
您可以提供给子进程的唯一信息是该进程接受(理解)为调用参数的信息,并且必须将其作为字符串提供。 子进程需要解释调用参数,并通过解析它们来创建所需的对象。
就您而言-您需要提供有关ftp
和stage
所有重要信息,以便新进程可以重新创建实例。 即使这样,它们仍将是新流程所拥有的全新对象,而与父流程的对象无关。
不,您不能跨进程边界传递实例对象(好吧,有共享内存,但是您不能在Java中使用它,而且在C语言中通常也不是正确的解决方案)。 您可以做的是在进程之间传递消息 。 命令行参数是一种方法,但是正如您所发现的,它们仅限于可以序列化为字符串的数据。
另一个选择是在子进程中序列化对象并反序列化它们。 例如,您可以打开一个从父对象到子对象的stdin
的ObjectOutputStream
,并通过该对象发送任意复杂的对象。 但是,您在另一侧获得的对象仍将是副本,但其对象标识与父进程中的对象不同。
仅当您要将Java程序作为单独的进程运行时,ProcessBuilder才能为您提供帮助。 无法将对象参数传递到ProcessBuilder中。 在两个不同的过程之间,您不能直接传递参数。 为此,您可以将那些对象存储到文件中,也可以通过管道传递对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.