繁体   English   中英

您可以从Java程序中运行Java类吗?

[英]Can you run a java class from within a java program?

我一直在创建一个编写并运行Java类的程序。 到目前为止,我已经能够编写“ Runable.java”类,但无法运行它。 我尝试运行“ runjava.bat”并获取.bat以运行“ Runable.java”类,但我不断收到“ 错误:找不到或加载主类application.Runable.class ”。 我想知道我在做什么错,或者是否有更好的方法可以从Java程序中运行Java类?

这是我的代码(略微简化):

Main.java:

package application;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

import javafx.application.Platform;
import javafx.stage.FileChooser;


public class Main {
final static String Program =
        "package application;\n"
        + "public class Runable {\n"
        + "public static void main(String[] args) {\n"
        + "System.out.println(\"Hello\");\n"
        + "}\n"
        + "}\n";

public static void main(String[] args) throws IOException {
    Scanner s = new Scanner(System.in);
    while(true){
    System.out.println("State a comand.");
    String Command = s.nextLine();
    if (Command.equalsIgnoreCase("Write") || Command.equalsIgnoreCase("Save")){
         FileChooser fileChooser = new FileChooser();

         //Set extension filter
         FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
         fileChooser.getExtensionFilters().add(extFilter);

         //Show save file dialog
         File file = new File("src/application/Runable.class");

         if(file != null){
             SaveFile(Program, file);
         }

    }
    else if (Command.equalsIgnoreCase("Run") || Command.equalsIgnoreCase("Play")){
        ProcessBuilder builder = new ProcessBuilder(
                "src/runjava.bat");
            builder.redirectErrorStream(true);
            Process p = builder.start();
            BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while (true) {
                line = r.readLine();
                if (line == null) { break; }
                System.out.println(line);
            }
    }
    else if (Command.equalsIgnoreCase("End") || Command.equalsIgnoreCase("Exit")){
        Platform.exit();
    }
    else{
        System.err.println("Command not recognized.");
        System.err.println("Please try again.");
    }
    }

}

private static void SaveFile(String content, File file){
    try {
        FileWriter fileWriter = null;

        fileWriter = new FileWriter(file);
        fileWriter.write(content);
        fileWriter.close();
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }

}


}

runjava.bat:

javac "src\application\Runable.java"
java application.Runable.class

如果您不是从Main.java获取它, 则为Runable.java

package application;
public class Runable {
public static void main(String[] args) {
System.out.println("Hello");
}
}

java命令需要一个类名,而不是文件名。 除非您的类在“ application.Runable”包中被称为“ class”(不是),否则您可能要使用:

java application.Runable

因为您不能执行这样的.java文件。 您必须首先对其进行编译以获取.class文件,然后将执行该类的代码更改为指向Runable.class

它不运行的原因是因为.java文件是您键入的代码,而.class文件是Java虚拟机执行的代码的编译版本。

与执行.bat文件相比,编译和运行程序的另一种方法是使用javax.tools API或基于它的另一个库。 我发现了InMemoryJavaCompiler库,可以轻松编译和运行程序。 这种方法意味着该程序将在与您的UI相同的JVM上运行,这可能会有所帮助。

以下代码显示了如何使用该库调用程序。

try{
    Class<?> clazz = InMemoryJavaCompiler.compile("apllication.Runable", Program);
    clazz.getMethod("main", String[].class).invoke(null, new String[0]);
}catch(Exception e){
    e.printStackTrace();
}

Main.java的“运行”块中,您应该具有

ProcessBuilder builder = new ProcessBuilder("runjava.bat");

在您的runjava.bat ,您应该拥有(如immibis所说)

javac -d . src/application/Runable.java
java application.Runable

**第二行不是Runable.class。

并且runjava.bat应该与application\\的父文件夹并行放置,而不是src\\application文件夹。 换句话说,您应该具有类似于classes\\runjava.batclasses\\application\\Main.classclasses\\application\\Runable.class 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM