从java代码运行.class文件
如何从java代码本身运行编译后的代码(从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
.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>");
这里要注意两件事:
如果磁盘上有
.class
文件,只需生成一个新进程并运行java命令,就像从命令行运行一样:
Process p = Runtime.getRuntime().exec("java <java class file>");
这里要注意两件事:
还有很多构建/编译工具,如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.";
}
}