java中动态执行一段代码

动态|执行

动态的执行一段简单代码,采用生成java文件,调用javac编译,反射执行的方式。

只是一个简单测试,有些地方有待完善。

代码如下

--------------------------------------------------------------------------------

import java.io.*;

/**
* 动态执行一段代码(生成文件->编译->执行)
* @author kingfish
* @version 1.0
*/
public class TestRun {
private String fileName = "Test.java";
private String className= "Test.class";
public TestRun() {
File f = new File(fileName);
if(f.exists()) f.delete();

f = new File(className);
if(f.exists()) f.delete();
}

/**
* 创建java文件
*/
public void createJavaFile(String body) {
String head = "public class Test{\r\n public static void runCode(){";

String end = "\r\n }\r\n}";
try {
DataOutputStream dos = new DataOutputStream(new FileOutputStream(
fileName));
dos.writeBytes(head);
dos.writeBytes(body);
dos.writeBytes(end);
dos.close();
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* 编译
*/
public int makeJavaFile() {
int ret = 0;
try {
Runtime rt = Runtime.getRuntime();
Process ps = rt.exec("cmd /c javac " + fileName);
ps.waitFor();
byte[] out = new byte[1024];
DataInputStream dos = new DataInputStream(ps.getInputStream());
dos.read(out);
String s = new String(out);
if (s.indexOf("Exception") > 0) {
ret = -1;
}
}
catch (Exception e) {
ret = -1;
e.printStackTrace();
}
return ret;
}

/**
* 反射执行
*/
public void run() {
try {
Class.forName("Test").getMethod("runCode", new Class[] {}).invoke(null, new Object[]{});
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* 测试
*/
public static void main(String[] args) {

String cmd = "System.out.println(\"usage:java TestRun int i=1; System.out.println(i+100);\");";
if(args.length>=1){
cmd = args[0];
}
TestRun t = new TestRun();
t.createJavaFile(cmd);
if (t.makeJavaFile() == 0) {
t.run();
}
}
}

--------------------------------------------------------------------------------

测试:

java TestRun System.out.println(\"Hello,World!\");

java TestRun "int i=1;int j=2;System.out.println(i+j);"

--------------------------------------------------------------------------------

如有任何问题,请指正!

kingfish

时间: 2024-08-03 06:14:55

java中动态执行一段代码的相关文章

在Java中动态执行类的静态方法

在Java中,通过Class.forName()方法可以动态决定加载哪一个类,这个功能对于相同接口的不同实现来讲非常有用.比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用Class.forName(configClassName).getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码.这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的

java-初学Java,想知道这段代码哪里出错了

问题描述 初学Java,想知道这段代码哪里出错了 package text; public class text1 { int a; int b; public void print() { System.out.println("a="+a+",b="+b); } } class text2 { public static void main(String[] args) { text1 x=new text2(); x.a=111; x.b=222; x.pri

详解java中动态代理实现机制_java

代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. JAVA各种动态代理实现的比较 接口 interface AddInterface{ int add(int a, int b); } interface SubInterfa

c#-C#串口 循环执行一段代码

问题描述 C#串口 循环执行一段代码 C#串口怎么在button1后,每隔一秒向串口发送一次数据,在按一下button1,停止循环 解决方案 按下 Button1 启动一个定时为一秒的 Timer,在 timer 的响应中发送数据.再按Button1,则关闭 Timer. 解决方案二: 设置Timer 定时器,1S向串口发送数据一次数据 解决方案三: 用timer,关于定时的,一般用timer 解决方案四: Timer或者Thread while(true){ System.Threading.

jsp-Struts中有没有办法在渲染每个UI控件时都执行一段代码

问题描述 Struts中有没有办法在渲染每个UI控件时都执行一段代码 我有这么个需求:希望能通过数据库配置来指定每个页面上的每个UI控件是否最终显示出来.表结构例如: page | component_id | is_display 有什么办法能够加个拦截器之类的东西,在Struts渲染每个UI控件之前能执行这个拦截器,在拦截器里能取到当前被渲染的控件对象,并修改控件对象的属性吗? 我只知道Struts有Interceptor,但貌似只是拦截后台Action的,不知道是不是能处理UI控件. 请各

如何在aspx网页加载好后自动执行一段代码?

问题描述 如何在aspx网页加载好后自动执行一段代码? 我想在我的网页加载好后,自动执行一段代码,是根据登录的用户,来设置元素的属性,需要aspx先把页面加载好后再执行,How to do? 解决方案 window.onload=function(){ alert('window ready'); //your code.... }</script>

java 中的静态方法和静态代码块分别装载到哪个区

问题描述 java中的静态方法和静态代码块分别装载到哪个区 解决方案 解决方案二: 解决方案三:楼主可看看楼上说的挺好学习了顶解决方案四:应该是栈里解决方案五:方法都是在方法区中,无论是不是静态的.方法表中有一个代码属性,代码属性存放方法代码.解决方案六:好,收了解决方案七:谢谢1楼的,学习了!

eclipse-在Eclipse中怎么编写一段代码可以自动找到想要的文件和打印出所在的路径?

问题描述 在Eclipse中怎么编写一段代码可以自动找到想要的文件和打印出所在的路径? 在Eclipse中怎么编写一段代码可以自动找到想要的文件和打印出所在的路径? 解决方案 http://blog.csdn.net/aotian16/article/details/5775778

使用使用脚本或任何语言能够在网站源码中剪切出一段代码

问题描述 使用使用脚本或任何语言能够在网站源码中剪切出一段代码 使用使用脚本或任何语言能够在网站源码中剪切出一段代码 使用使用脚本或任何语言能够在网站源码中剪切出一段代码