从java代码运行.class文件

从java代码运行.class文件,java,compiler-construction,jvm,Java,Compiler Construction,Jvm,如何从java代码本身运行编译后的代码(.class)java 我正在做一种提供服务的工作,比如在服务器端编译和运行java代码,并向最终用户提供输出 有人能提出一种方法来实现这一点吗 import java.io.*; public class demo { public static void main(String args[]) throws IOException, InterruptedException { int result; try

如何从java代码本身运行编译后的代码(
.class
)java

我正在做一种提供服务的工作,比如在服务器端编译和运行java代码,并向最终用户提供输出

有人能提出一种方法来实现这一点吗

import java.io.*;

public class demo {

    public static void main(String args[]) throws IOException, InterruptedException {
        int result;
        try {

            System.out.println("command output:");
            Process proc = Runtime.getRuntime().exec("java -cp . demoh");
            InputStream in = proc.getInputStream();
            result = proc.waitFor();

            BufferedInputStream buffer = new BufferedInputStream(proc.getInputStream());

            BufferedReader commandOutput = new BufferedReader(new InputStreamReader(buffer));
            System.out.print(commandOutput);

            String line = null;
            try {
                while ((line = commandOutput.readLine()) != null) {
                    System.out.print(line);
                    System.out.println("command output: " + line);
            }//end while
            commandOutput.close();

            } catch (IOException e) {
                //log and/or handle it  
            }
        } catch (IOException e) {
            System.err.println("IOException raised: " + e.getMessage());
        }
    }
}

创建.jar文件并将该文件添加到构建路径

创建.jar文件并将该文件添加到构建路径

如果磁盘上某处有
.class
文件,只需生成一个新进程并像从命令行一样运行java命令:

Process p = Runtime.getRuntime().exec("java <java class file>");
这里要注意两件事:

  • java进程给出的运行时错误被发送到错误流,而不是输入流,因此您必须同时读取它们
  • 进程正在运行时,您必须读取流。在读取流之前等待进程完成会导致死锁,因为进程输出缓冲区已满,正在等待父进程读取数据,而父进程正在等待子进程完成
    如果磁盘上有
    .class
    文件,只需生成一个新进程并运行java命令,就像从命令行运行一样:

    Process p = Runtime.getRuntime().exec("java <java class file>");
    
    这里要注意两件事:

  • java进程给出的运行时错误被发送到错误流,而不是输入流,因此您必须同时读取它们
  • 进程正在运行时,您必须读取流。在读取流之前等待进程完成会导致死锁,因为进程输出缓冲区已满,正在等待父进程读取数据,而父进程正在等待子进程完成 试一试

    试一试


    还有很多构建/编译工具,如Ant或Maven,您可以在编写自己的之前进行检查。

    还有很多构建/编译工具,如Ant或Maven,您可以在编写自己的之前进行检查。

    其中一个选项是使用类加载器创建类的实例。类装入器可以将您的类作为字节数组,然后您可以创建它的实例并运行它。请参阅JDK文档中的。

    其中一个选项是使用类加载器创建类的实例。类装入器可以将您的类作为字节数组,然后您可以创建它的实例并运行它。请参见JDK文档中的内容。

    下面是一个示例应用程序,它将编译Java源文件、加载类、实例化实例,并打印出HelloWorld类的toString()。我相信类路径上需要tools.jar。示例代码要求源文件位于src文件夹中。类路径上需要src文件夹,因为默认情况下,.class文件将在那里生成

    要获得对Java编译器的更多控制,请阅读javax.tools包

    package sourcerunner;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    public class SourceRunner {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, InterruptedException {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    
            compiler.run(System.in, System.out, System.err, "src/sourcerunner/HelloWorld.java");
    
            TimeUnit.SECONDS.sleep(1L);
    
            Class<?> cls = Class.forName("sourcerunner.HelloWorld");
    
            Object instance = cls.newInstance();
    
            System.out.println(instance);
        }
    }
    

    上面的代码非常不安全。理解代码后,修改代码以使用新的类加载器加载和实例化该类。确保类加载器具有最低权限。

    下面是一个示例应用程序,它将编译Java源文件,加载类,实例化实例,并打印出类HelloWorld的toString()。我相信类路径上需要tools.jar。示例代码要求源文件位于src文件夹中。类路径上需要src文件夹,因为默认情况下,.class文件将在那里生成

    要获得对Java编译器的更多控制,请阅读javax.tools包

    package sourcerunner;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    public class SourceRunner {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, InterruptedException {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    
            compiler.run(System.in, System.out, System.err, "src/sourcerunner/HelloWorld.java");
    
            TimeUnit.SECONDS.sleep(1L);
    
            Class<?> cls = Class.forName("sourcerunner.HelloWorld");
    
            Object instance = cls.newInstance();
    
            System.out.println(instance);
        }
    }
    

    上面的代码非常不安全。理解代码后,修改代码以使用新的类加载器加载和实例化该类。确保类加载器具有最低权限。

    谢谢你的ans。但是我想构建像codepad.org这样的应用程序来提供服务器端编译,运行它,向用户显示输出。那么你能指导我如何使用.jar文件吗?谢谢你的ans。但是我想构建像codepad.org这样的应用程序来提供服务器端编译编译n运行它n向用户显示输出。那么您能指导我如何使用.jar文件吗?谢谢tudor,但在此之后,我正在编写BufferedInputStream buffer=new BufferedInputStream(proc.getInputStream());BufferedReader commandOutput=新的BufferedReader(新的InputStreamReader(buffer));String line=line=commandOutput.readLine();但没有包含在行中,它不会打印任何内容。有什么想法吗?@Madhav Kumar:你能在原始问题中发布这个代码吗?谢谢,。。。。这是我的问题。。我正在开发像codepad.org这样的webapp,为此我需要编译和运行从客户端到服务器的代码,并使用java编译和运行服务器端的代码。因此,我已经在服务器端完成了编译,并生成了.class文件,现在我想在服务器端运行该.class文件,并向提交代码的用户显示该文件的输出。:)@Madhav Kumar:请编辑您的原始问题,并发布您第一条评论中的代码,以便其他人也能看到。注意:谢谢……请检查我是否编辑了原始问题,并发布了我正在工作的代码。帮助我。谢谢tudor,但在此之后,我正在编写BufferedInputStream buffer=new BufferedInputStream(proc.getInputStream());BufferedReader commandOutput=新的BufferedReader(新的InputStreamReader(buffer));String line=line=commandOutput.readLine();但没有包含在行中,它不会打印任何内容。有什么想法吗?@Madhav Kumar:你能在原始问题中发布这个代码吗?谢谢,。。。。这是我的问题。。我正在开发像codepad.org这样的webapp,为此我需要编译和运行从客户端到服务器的代码,并使用java编译和运行服务器端的代码。所以我已经在服务器端完成了kine的编译并生成了.class文件,现在我想在服务器端运行该.class文件,并显示输出p
    package sourcerunner;
    
    public class HelloWorld {
    
        @Override
        public String toString() {
            return "Hello Java Compiler World.";
        }
    }