java se 编译,java SE 六中的动态编译

java SE 6中的动态编译

今天简单学习了下java SE下的动态编译方式,写了一个小小的demo,用来参考

public class JavaCompilerTest {

/**

* @param args

* main方法

*/

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

test("Test.java");

}

/**

* @param clazzName

* 类名

* @throws Exception

*此处异常为了简便,只是简单抛出 读入一个java文件,并编译,加载类,生成对象,使用反射调用方法*/

public static void test(String clazzName) throws Exception {

// 使用StringBuilder来保存一个类,当然,也可以自己通过参数传过来

// 使用StringBuilder的原因是StringBuilder比StringBuffer快,用于单线程情况

// StringBuffer用于多线程安全的情况,详情见jdk文档

StringBuilder str = new StringBuilder();

str.append("public class Test {" + "\n");

str.append("public void test() {" + "\n");

str.append("System.out.println(\"Compiler success! \");" + "\n");

str.append("}" + "\n");

str.append("}");

// 将java文件写入src文件夹下

FileOutputStream fo = new FileOutputStream("src/" + clazzName);

fo.write(str.toString().getBytes());// 直接写入文件

fo.flush();

fo.close();// 关闭流

System.out.println(System.getProperty("user.dir"));

// 获取编译器,如果使用eclipse开发工具,此处易报Nullpointer错误,解决方法见我的另一篇文章

JavaCompiler javac = ToolProvider.getSystemJavaCompiler();

int state = 1;// 保存编译返回的状态,0编译成功,非0编译失败

try {

//编译类文件,输出到bin文件夹下

state = javac.run(System.in, System.out, System.err, "-d",

System.getProperty("user.dir") + "\\bin",

System.getProperty("user.dir") + "\\src\\Test.java");

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (state != 0) {

System.out.println("compiler failed!");

System.exit(0);

}

//通过类名加载类

Class> clazz = Class.forName("Test");

//获取类的方法,test方法无参数,所以getDeclaredMethod后面的参数省略

Method method = clazz.getDeclaredMethod("test");

//调用对应的方法

method.invoke(clazz.newInstance());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值