1

我有一个问题,我有一个程序可以编写和创建一个 .java 文件并将其放入我的包文件夹中,之后它从 .java 文件中获取信息并在其中使用它。(它使用我然后导入的方法创建一个新类)。问题是,如果在我使用 Eclipse 更新“自创建文件”之前它不会工作。有没有办法让我的主文件更新“自我创建的文件”。

抱歉,如果这是重复的。我只是在任何地方都找不到它。

我的代码:

package dk.Nicolai.Bonde;
import java.io.*;

public class main {

public String outputString ="Math.sqrt(25)" ;
static String outputPath ="src/output.txt";
/**
 * @param args
 * @throws UnsupportedEncodingException 
 * @throws FileNotFoundException 
 */
public static void main(String[] args) throws IOException{
        new main().doit(args);
    }

public void doit(String[] args) throws IOException{
    PrintWriter writer = new PrintWriter("src/dk/Nicolai/Bonde/calculate.java", "UTF-8");
        writer.println("package dk.Nicolai.Bonde;");
        writer.println("public class calculate{");
        writer.println("public void calc(){");
        writer.println("System.out.println("+outputString+");");
        writer.println("}");    
        writer.println("}");
        writer.flush();
        writer.close();

    calculate calcObj = new calculate();
    calcObj.calc();

}
}
4

3 回答 3

3

您的主要错误是您希望它在运行时.class在保存后自动编译到文件中(每次按下 Ctrl+S 时,像 Eclipse 这样的理智 IDE 都会在幕后自动为您执行此操作)。因此这是不正确的。运行时需要自己编译JavaCompiler,然后加载URLClassLoader。这个相关的问答中给出了一个具体的例子:如何以编程方式编译和实例化 Java 类?

在具体示例中,您还会注意到您不能只做anew calculate();之后。类路径在运行时左右不会自动刷新。你需要做一个Class#forName(),通过 FQN 和URLClassLoader. 例如

Calculate calculate = (Calculate) Class.forName("com.example.Calculate", true, classLoader);

您的另一个错误是您依赖磁盘文件系统的当前工作目录始终是 Eclipse 项目的源根文件夹。这并不稳健。在构建和分发应用程序时,此文件夹根本不存在。您应该改为将文件写入 IDE 项目结构之外的其他位置的固定/绝对文件夹。这也包含在上述答案中。

于 2012-12-19T20:16:54.787 回答
0

你不能。您必须在 Eclipse 中手动更新资源。尽管您可以为 Eclipse 编写一个插件来运行您的文件并更新资源。

Eclipse 使用目录和文件来存储其资源,但不是文件系统的直接表示。

于 2012-12-19T20:12:54.027 回答
0

您的代码无法工作,因为

  • 在 main 的编译时需要计算。您在运行时提供它。
  • calculate.java不会编译,因此即使是其他动态加载类的技术也不起作用

如果要在运行时构建类,请考虑使用反射 API

于 2012-12-19T20:15:08.397 回答