Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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源代码而不写入文件_Java - Fatal编程技术网

从字符串编译java源代码而不写入文件

从字符串编译java源代码而不写入文件,java,Java,我发现了一些很好的例子: // Prepare source somehow. String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }"; // Save source in .java file. File root = new File("/java"); //

我发现了一些很好的例子:

// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";

// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
new FileWriter(sourceFile).append(source).close();

// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());

// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
Object instance = cls.newInstance(); // Should print "world".
System.out.println(instance); // Should print "test.Test@hashcode".
//以某种方式准备源代码。
String source=“包测试;公共类测试{static{System.out.println(\'hello\”);}公共测试(){System.out.println(\'world\”;}}”;
//将源代码保存在.java文件中。
文件根=新文件(“/java”);//在运行于C:\上的Windows上,这是C:\java。
File sourceFile=新文件(根,“test/test.java”);
sourceFile.getParentFile().mkdirs();
新建FileWriter(sourceFile).append(source).close();
//编译源文件。
JavaCompiler=ToolProvider.getSystemJavaCompiler();
run(null,null,null,sourceFile.getPath());
//加载并实例化已编译的类。
URLClassLoader=URLClassLoader.newInstance(新URL[]{root.toURI().toURL()});
Class cls=Class.forName(“test.test”,true,classLoader);//应该打印“你好”。
对象实例=cls.newInstance();//应该打印“世界”。
System.out.println(实例);//应该打印“测试”。Test@hashcode".
问题:无需写入文件,是否可以实现完全相同的效果

@编辑: 更确切地说:我知道如何从字符串(重载JavaFileObject)编译。但是做完这些之后,我不知道如何加载这个类。我可能错过了输出写入部分,但这也是我不想做的事情

@Edit2 对于任何感兴趣的人,我创建了这个小项目来实现所讨论的功能:

好,下面是一个使用
JavaCompiler
字符串
输入进行编译的示例。这是它的核心

在中,我加载已编译的类。您会注意到,我还使用正则表达式检测包和类名


至于输出,如果你想在内存中这样做,那么如果你实现了你自己的,你似乎可以这样做;但是我从来没有试过


注意,通过扩展可以很容易地调试所发生的事情,但Groovy的Java库使从字符串编译和计算表达式变得很容易。语法不完全相同,但与Java非常相似,因此,如果您可以更改要编译的字符串,使它们在Groovy而不是Java中,那么任务将非常简单。请参阅以获取代码示例。

好的,我删除了我的注释,因为它确实写入了一个文件。。。但是请注意,我自动检测到包名以及类名;)@乔:不,这不是OP想要的;他知道如何从字符串编译,他想把编译过程的结果写在内存中,而不是写在内存中file@fge很好,我为匆忙道歉,我将删除所有其他痕迹:)看看我发布的第一个链接;我也使用类加载器加载编译后的结果。那么输入文件呢?通过对
JavaCompiler
从其文件管理器获得的接口的简要阅读,似乎可以将自己的内存流“插入”到编译器的输入中。@dasblinkenlight是的,这是可行的,这是OP已经做过的;这里的问题是输出,而不是输入。事实上,我已经编写了一个编译过程,它可以从
字符串中读取源代码。看起来OP的代码并没有避免写入输入文件:请参阅
新文件编写器(sourceFile).append(source).close()
行。@dasblinkenlight是的,我的角色有脑屁。因此,我粘贴了到我编写的代码的链接,该代码正是这样做的。啊,
FromStringFileObject
!!!真漂亮!