我遇到这个问题,我有一个程序写入并创建一个.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();
}
}
答案 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使用目录和文件来存储其资源,但不是文件系统的直接表示。
答案 2 :(得分:0)
您的代码无效,因为
如果要在运行时构建类,请考虑使用reflexion API