我试图编写一个带有接口的java程序,该接口允许用户创建.java文件并编译并运行它(本质上是一个非常简单的IDE)。我使用java swing作为gui,并且到目前为止能够将接口内的.java文件编译成.class文件。我一直在研究如何从java代码中运行.class文件,但是找到了我无法解决的广泛答案。以下是编译的相关代码:
<!doctype html>
<html>
<head>
<title></title>
<style>
html, body {
height: 100%;
width: 100%;
padding: 0;
margin: 0;
}
</style>
<script>
window.addEventListener('load', function ol(){
document.body.addEventListener('click', function cl(){
var p = document.createElement('p');
p.textContent = 'Hello World!';
document.body.appendChild(p);
});
});
</script>
</head>
<body>
</body>
</html>
如何运行已编译的.class文件并在我的代码中捕获其输出?
答案 0 :(得分:1)
编译完成后,您需要加载Class
对象,然后调用main(String[])
方法。要捕获标准输出,您需要使用System.setOut
。
private String invokeClass(String className) throws URISyntaxException, IOException, ReflectiveOperationException {
Class<?> clazz = Class.forName(className);
// Alternatively, you can load the new class with a new Classloader, if you don't want to pollute the current Classloader
// Class<?> clazz = new URLClassLoader(new URL[]{getClass().getClassLoader().getResource("").toURI().toURL()}, getClass().getClassLoader()).loadClass(className);
Method main = clazz.getDeclaredMethod("main", String[].class);
try ( ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(out)) {
System.setOut(ps);
main.invoke(main, new Object[]{new String[0]});
return out.toString();
}
finally {
// Reset to the console
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
}
}