在 ProcessBuilder 中将对象作为参数传递?
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();
}
}
此处测试 class 未执行,但如果我删除这两个参数,则只有它有效。有人可以告诉我如何将对象作为参数传递吗?
当您启动一个新进程时,它不会与父进程共享任何 数据。这与从命令行调用子进程是一样的。
您可以向子进程提供的唯一信息是被该进程接受(理解)为调用参数的信息并且它们必须作为字符串提供。子进程需要对调用参数进行解释,并通过解析创建需要的对象。
在您的情况下 - 您需要提供有关 ftp
和 stage
的所有重要信息,以便新进程可以重新创建实例。即使那样,这些也将是新进程拥有的全新对象,独立于父进程的对象。
不,您不能跨进程边界传递实例对象(嗯,好吧,有共享内存,但您不能在 Java 中使用它,而且在 C 中通常不是正确的解决方案任何一个)。您可以做的是在进程之间传递 消息 。命令行参数是一种方式,但正如您所发现的那样,它们仅限于可以序列化为字符串的数据。
另一种选择是序列化您的对象并在子进程中反序列化它们。例如,您可以打开一个从父项到子项的 stdin
的 ObjectOutputStream
,并通过它发送任意复杂的对象。但是,您在另一端获得的对象仍然是副本,与父进程中的对象的对象标识不同。
ProcessBuilder 只能在您想要 运行 一个 java 程序作为单独的进程时帮助您。无法将对象参数传递到 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();
}
}
此处测试 class 未执行,但如果我删除这两个参数,则只有它有效。有人可以告诉我如何将对象作为参数传递吗?
当您启动一个新进程时,它不会与父进程共享任何 数据。这与从命令行调用子进程是一样的。
您可以向子进程提供的唯一信息是被该进程接受(理解)为调用参数的信息并且它们必须作为字符串提供。子进程需要对调用参数进行解释,并通过解析创建需要的对象。
在您的情况下 - 您需要提供有关 ftp
和 stage
的所有重要信息,以便新进程可以重新创建实例。即使那样,这些也将是新进程拥有的全新对象,独立于父进程的对象。
不,您不能跨进程边界传递实例对象(嗯,好吧,有共享内存,但您不能在 Java 中使用它,而且在 C 中通常不是正确的解决方案任何一个)。您可以做的是在进程之间传递 消息 。命令行参数是一种方式,但正如您所发现的那样,它们仅限于可以序列化为字符串的数据。
另一种选择是序列化您的对象并在子进程中反序列化它们。例如,您可以打开一个从父项到子项的 stdin
的 ObjectOutputStream
,并通过它发送任意复杂的对象。但是,您在另一端获得的对象仍然是副本,与父进程中的对象的对象标识不同。
ProcessBuilder 只能在您想要 运行 一个 java 程序作为单独的进程时帮助您。无法将对象参数传递到 ProcessBuilder。两个不同进程之间不能直接传递参数。为此,您可以将这些对象存储到文件中,或者可以通过管道传递对象。