Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何等待Java文件被写入,然后使用classloader从中生成实例?_Java_File - Fatal编程技术网

如何等待Java文件被写入,然后使用classloader从中生成实例?

如何等待Java文件被写入,然后使用classloader从中生成实例?,java,file,Java,File,我编写了一些创建java文件的代码,然后使用ClassLoader从中创建实例。我的问题是ClassLoader如果我在编写文件后不执行sleep操作,就会抛出ClassNotFoundException 因此,我需要一种方法,使线程休眠,直到文件完成写入所有文件 比如: File javaFile = new File(serverPath + pkgname + "/" + className + ".java") if (javaFile.getParentFile().exists()

我编写了一些创建java文件的代码,然后使用
ClassLoader
从中创建实例。我的问题是
ClassLoader
如果我在编写文件后不执行sleep操作,就会抛出
ClassNotFoundException

因此,我需要一种方法,使线程休眠,直到文件完成写入所有文件

比如:

File javaFile = new File(serverPath + pkgname + "/" + className + ".java")

if (javaFile.getParentFile().exists() || javaFile.getParentFile().mkdirs()) {
            Writer writer = null;
            writer = new FileWriter(javaFile);
            writer.write(sb.toString());
            writer.flush();
            writer.close();
            Method method = Class.forName(pkgname + "." + className).getMethod("main", String[].class);
            String[] params = new String[0]; // init params accordingly
            method.invoke(null, (Object) params);
  }

问题是编译器没有在生成路径中生成.class文件,因此程序会等待IDE的自动编译执行

@AndyTurner好的,再次检查问题,你能展示你调用编译器的代码吗?或者您不调用它并假设某个IDE(Eclipse?)正在后台运行以编译Java文件吗?在后一种情况下,一旦打包/部署应用程序,您将看到一个惊喜……如果您想执行一个可以使用的
.java
文件。java源代码必须在加载到JVM之前编译成<代码> .class /代码>文件(字节码)。如果可能,考虑使用代理@ AMGADMHM,我可以保证,一旦调用<代码>编写器。关闭< /code >,它将阻塞直到java文件已写入磁盘。您的问题是,其他地方还有一些代码似乎在扫描该Java文件并将其编译为类文件,您尝试使用
class.forName
加载该类文件。您必须调整它,以便可以等待它(例如使用
wait
/
notify
模式),直到它编译完所有内容。但是可能更好的方法是直接在
writer.close
类.forName
之间调用该代码。