运行外部java类(项目)

运行外部java类(项目),java,class,project,external,execute,Java,Class,Project,External,Execute,我想从Java项目内部运行外部Java项目(类)。我不是指任何程序(例如EXE文件),而是指java类(项目) 让您考虑字符串中的类文件路径: String = "C:\\test\\test.class"; “运行”另一个java程序是通过调用它的主方法来完成的。假设您有要运行的类net.tilialacus.TheProg,那么您可以(在其他java程序中)运行 或者,如果在编译时不知道该类,则通过反射: Class<?> theClass = Class.forNam

我想从Java项目内部运行外部Java项目(类)。我不是指任何程序(例如EXE文件),而是指java类(项目)

让您考虑字符串中的类文件路径:

String = "C:\\test\\test.class";
“运行”另一个java程序是通过调用它的主方法来完成的。假设您有要运行的类net.tilialacus.TheProg,那么您可以(在其他java程序中)运行

或者,如果在编译时不知道该类,则通过反射:

    Class<?> theClass = Class.forName("net.tilialacus.TheProg");
    Method method = theClass.getDeclaredMethod("main", String[].class);
    String[] args = { "arg1", "arg2"};
    method.invoke(null, (Object)args);
Class theClass=Class.forName(“net.tilialacus.TheProg”);
方法=class.getDeclaredMethod(“main”,String[].class);
字符串[]args={“arg1”,“arg2”};
调用(null,(Object)args);
当然,如果类不存在或没有“publicstaticmain(String[])”方法,则需要处理异常

“运行”另一个java程序是通过调用它的主方法来完成的。假设您有要运行的类net.tilialacus.TheProg,那么您可以(在其他java程序中)运行

或者,如果在编译时不知道该类,则通过反射:

    Class<?> theClass = Class.forName("net.tilialacus.TheProg");
    Method method = theClass.getDeclaredMethod("main", String[].class);
    String[] args = { "arg1", "arg2"};
    method.invoke(null, (Object)args);
Class theClass=Class.forName(“net.tilialacus.TheProg”);
方法=class.getDeclaredMethod(“main”,String[].class);
字符串[]args={“arg1”,“arg2”};
调用(null,(Object)args);

当然,如果类不存在或没有“publicstaticmain(String[])”方法,则需要处理异常

除了你那充满需求的语气之外,你似乎还想要某种插件结构

基本上,您需要一个
ClassLoader
,它将加载您想要的类/库。一旦加载,您就可以使用它们


也许这对你有帮助:

除了你的要求语气之外,你似乎想要某种插件结构

基本上,您需要一个
ClassLoader
,它将加载您想要的类/库。一旦加载,您就可以使用它们


也许这对您有帮助:

这是
类加载器的责任。如果磁盘上有要实例化/使用的外部
.class
文件,那么一旦知道可用的API,就相对简单了:

File f = ...; // Folder containing the .class files

ClassLoader loader = new URLClassLoader(new URL[] { f.toURI().toURL() }, getClass().getClassLoader(););
for (File classFile : f.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".class");
    }
})) {
    try {
        String filename = classFile.getName();
        // Remove the .class extension
        Class<?> cls = loader.loadClass(filename.substring(0, filename.length() - 6));
        // Do something with the class
    } catch (Exception ex) {
        LOGGER.error("Unable to load plugin: " + ex.getMessage());
    }
}
文件f=…;//包含.class文件的文件夹
ClassLoader=新的URLClassLoader(新的URL[]{f.toURI().toURL()},getClass().getClassLoader(););
对于(文件classFile:f.listFiles(新文件名过滤器(){
公共布尔接受(文件目录,字符串名称){
返回名称.endsWith(“.class”);
}
})) {
试一试{
字符串文件名=classFile.getName();
//删除.class扩展名
类cls=loader.loadClass(filename.substring(0,filename.length()-6));
//在课堂上做点什么
}捕获(例外情况除外){
LOGGER.error(“无法加载插件:+ex.getMessage());
}
}

这是
类加载器的责任。如果磁盘上有要实例化/使用的外部
.class
文件,那么一旦知道可用的API,就相对简单了:

File f = ...; // Folder containing the .class files

ClassLoader loader = new URLClassLoader(new URL[] { f.toURI().toURL() }, getClass().getClassLoader(););
for (File classFile : f.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".class");
    }
})) {
    try {
        String filename = classFile.getName();
        // Remove the .class extension
        Class<?> cls = loader.loadClass(filename.substring(0, filename.length() - 6));
        // Do something with the class
    } catch (Exception ex) {
        LOGGER.error("Unable to load plugin: " + ex.getMessage());
    }
}
文件f=…;//包含.class文件的文件夹
ClassLoader=新的URLClassLoader(新的URL[]{f.toURI().toURL()},getClass().getClassLoader(););
对于(文件classFile:f.listFiles(新文件名过滤器(){
公共布尔接受(文件目录,字符串名称){
返回名称.endsWith(“.class”);
}
})) {
试一试{
字符串文件名=classFile.getName();
//删除.class扩展名
类cls=loader.loadClass(filename.substring(0,filename.length()-6));
//在课堂上做点什么
}捕获(例外情况除外){
LOGGER.error(“无法加载插件:+ex.getMessage());
}
}

Lindsjo假设我有一个项目example1和它的主类example1.class。我如何从java程序构建和运行它?你知道吗?@100798这个类已经在类路径中了吗?所以你应该能够使用我上面展示的。如果没有,那么您必须通过类加载器加载它(参见craig的答案)。你对哪一部分有问题?Lindsjo,假设我有一个项目example1和它的主类example1.class。我如何从java程序构建和运行它?你知道吗?@100798这个类已经在类路径中了吗?所以你应该能够使用我上面展示的。如果没有,那么您必须通过类加载器加载它(参见craig的答案)。你对哪一部分有问题?你的例子似乎更一般。考虑最简单的例子,假设在字符串字符串中有类文件路径=“c:\\\test.class”。现在如何运行(加载)它…你读过代码了吗?从字面上说,第一行是你唯一需要写的东西,让它按照你想要的方式工作。你有什么特别的地方不舒服吗?如果您只想让它加载一个特定的文件,那么您可以(如果您想要一行更改)更改
FilenameFilter
,只为“test.class”案例返回true。是的,但它不起作用。文件名将文件夹的所有类保留在字符串中。即使有一个.class文件,它也不做任何事情。不加载该类。我在那个文件夹上有一个简单的GUI程序,但它不加载。更重要的是,没有出现错误。@100798我不太明白-您在该文件夹上有GUI程序是什么意思?“filename将文件夹中的所有类保留在字符串中”是什么意思?如果程序不工作并且没有抛出错误,那么您需要进行调试。如果您有使用断点的经验,可以使用这些断点,也可以使用
System.out.println()
在某些点打印变量的值。没有你的帮助,我们无法帮助你。:)好吧,这是我的错,没有解释清楚。首先,GUI只是我想要运行的示例java项目。其次,字符串“filename”保留所有.class文件