gpt4 book ai didi

java - URLClassLoader + loadClass + 在独立进程上调用 main 方法? java

转载 作者:搜寻专家 更新时间:2023-11-01 02:34:30 26 4
gpt4 key购买 nike

我正在使用以下方法调用 jar 文件中的类:

invokeClass("path.to.classfile", new String[] {});

public static void invokeClass(String name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, MalformedURLException {
File f = new File(System.getProperty("user.home") + File.separator + ".myapplication"+File.separator+"myjar.jar");

URLClassLoader u = new URLClassLoader(new URL[]{f.toURI().toURL()});
Class c = u.loadClass(name);
Method m = c.getMethod("main", new Class[] { args.getClass() });
m.setAccessible(true);
int mods = m.getModifiers();
if (m.getReturnType() != void.class || !Modifier.isStatic(mods) || !Modifier.isPublic(mods)) {
throw new NoSuchMethodException("main");
}
try {
m.invoke(null, new Object[] { args });
} catch (IllegalAccessException e) {

}
}

是否可以在单独的进程中调用它?那么正在运行的应用程序和新调用的应用程序没有任何共同点吗?

情况:您启动程序 a(客户端更新程序)。从客户端 a 启动程序 b(客户端)

使用当前代码,项目 a 和项目 b 的所有实例共享相同的堆空间。我正在尝试实现一种状态,其中项目 b 的所有实例都是独立的,并且不关心项目 A 是否终止。

最佳答案

是的,实际上这使您免于完全执行该反射过程

您需要使用 ProcessBuilder在单独的虚拟机中启动新进程。

类似于:

ProcessBuilder pb = new ProcessBuilder("java", "-jar",  f.getAbsolutePath());
Process p = pb.start();

编辑

- Will that work if the program that does pb.start() terminates?

- Will that work if the java environmental variable isn't set (e.g. Mac OS X?)[can't test on mac os x]

确实如此。看看这个视频:

http://img33.imageshack.us/img33/8380/capturadepantalla201001s.png

源代码(省略导入):

// MainApp.java

public class MainApp {
public static void main( String [] args ) throws IOException {
JFrame frame = new JFrame("MainApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new JLabel("<html><font size='48'>Main App Running</font><html>") );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
launchSeparateProcess();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ){
System.out.println("MainAppp finished");
}
});
}
private static void launchSeparateProcess() throws IOException {
File f = new File("./yourjar.jar");
ProcessBuilder pb = new ProcessBuilder("java", "-jar", f.getAbsolutePath() );
Process p = pb.start();
}
}

//-- Updater.jar
public class Updater {
public static void main( String [] args ) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new JLabel("<html><font size='78'>Updating....</font></html>"));
frame.pack();
frame.setVisible(true);
}
}
//--manifest.mf
Main-Class: Updater

关于java - URLClassLoader + loadClass + 在独立进程上调用 main 方法? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2024893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com