从java代码中运行已编译的java .class文件并捕获输出

时间:2015-05-25 01:12:42

标签: java classloader javacompiler

我试图编写一个带有接口的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文件并在我的代码中捕获其输出?

1 个答案:

答案 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)));
    }
}