如何让java使用最新版本的文件

时间:2012-12-19 20:05:05

标签: java eclipse

我遇到这个问题,我有一个程序写入并创建一个.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();

}
}

3 个答案:

答案 0 :(得分:3)

你的主要错误是你期望它在运行期间在保存后自动编译成.class文件(每当你按下Ctrl + S时,Eclipse之类的理智IDE会在幕后自动执行)。因此不是这样。在运行时期间,您需要由JavaCompiler自行编译,然后按URLClassLoader加载。这个相关的问题和答案给出了一个具体的例子:How do I programmatically compile and instantiate a Java class?

您将在具体示例中注意到此后您无法 new calculate();。在运行时期间,类路径不会自动刷新。您需要执行Class#forName(),传递FQN和URLClassLoader。 E.g。

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

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

答案 1 :(得分:0)

不,你不能。您必须手动更新Eclipse中的资源。虽然您可以编写Eclipse的插件来运行您的文件并更新资源。

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

答案 2 :(得分:0)

您的代码无效,因为

    在主编译时需要
  • 计算。你在运行时提供它。
  • calculate.java 将无法编译,因此即使其他动态加载类的技术也无法正常工作

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