Java 动态编译

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
  
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
  
/**
 * 测试java的动态编译
 * @author dell
 *
 */
public class Demo01 {
public static void main(String[] args) throws Exception {
 
//通过IO流操作,将字符串存储成一个临时文件(Hi.java),然后调用动态编译方法!
String str = "public class Hi {public static void main(String[] args){System.out.println(\"HaHa,sxt!\");}}";
 
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "c:/myjava/HelloWorld.java");
System.out.println(result==0?"编译成功":"编译失败");
 
 
//通过Runtime调用执行类
//  Runtime run = Runtime.getRuntime();  
//        Process process = run.exec("java -cp  c:/myjava    HelloWorld");  
//  
//        InputStream in = process.getInputStream();
//        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//  String info = "";
//  while((info=reader.readLine())!=null){
//   System.out.println(info);
//  }
 
 try {
             URL[] urls = new URL[] {new URL("file:/"+"C:/myjava/")};
             URLClassLoader loader = new URLClassLoader(urls);
             Class c = loader.loadClass("HelloWorld");
             //调用加载类的main方法
             Method m = c.getMethod("main",String[].class);
             m.invoke(null, (Object)new String[]{});
             //由于可变参数是JDK5.0之后才有。
             //m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
             //因此,必须要加上(Object)转型,避免这个问题。
             //public static void main(String[] args)
              
         } catch (Exception e) {
             e.printStackTrace();
         }
}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值