• Java 动态编译--DynamicCompiler


    java 动态编译自己写过程的机会比较少,记录一下: 

     1 package com.xzlf.dynamicCompile;
     2 
     3 import java.io.IOException;
     4 import java.lang.reflect.Method;
     5 import java.net.URL;
     6 import java.net.URLClassLoader;
     7 
     8 import javax.tools.JavaCompiler;
     9 import javax.tools.ToolProvider;
    10 
    11 /**
    12  * java 动态性
    13  * @author xzlf
    14  *
    15  */
    16 public class Demo01 {
    17     public static void main(String[] args) throws IOException {
    18         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    19         int run = compiler.run(null, null, null, "f:/aa/temp/HelloWorld.java");
    20         System.out.println(run == 0 ? "编译成功" : "编译失败");
    21         /*
    22         // 通过RunTime 调用执行器  启动新进程运行
    23         Runtime runtime = Runtime.getRuntime();
    24         Process process = runtime.exec("java -cp f:/aa/temp HelloWorld");
    25         BufferedReader reader = new BufferedReader(
    26                 new InputStreamReader(process.getInputStream()));
    27         String info;
    28         while((info = reader.readLine()) != null) {
    29             System.out.println(info);
    30         }
    31         reader.close();
    32         */
    33         
    34         // 通过反射运行编译好的类
    35         try {
    36             URL[] urls = new URL[] {new URL("file:/f:/aa/temp/")};
    37             URLClassLoader loader = new URLClassLoader(urls);
    38             Class<?> c = loader.loadClass("HelloWorld");
    39             // 调用加载类的main方法
    40             Method m = c.getMethod("main", String[].class);
    41             m.invoke(null, (Object)new String[] {});
    42             //由于可变参数是JDK5.0之后才有。
    43             //m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
    44             //因此,必须要加上(Object)转型,避免这个问题。
    45             //public static void main(String[] args)
    46             
    47         } catch (Exception e) {
    48             e.printStackTrace();
    49         }
    50         
    51     }
    52 }

    运行测试:

    重视基础,才能走的更远。
  • 相关阅读:
    osx 编译安装配置 ruby on rails
    tls/ssl证书生成和格式转换
    nginx相关的一些记录
    用systemd脚本自动启动node js程序
    SSH Tunneling
    c代码读取目录信息
    用Qt Creator 对 leveldb 进行简单的读写
    centos 7 相关的一些记录
    发现一段精简的模板算法(非原创)
    几个常用的散列算法
  • 原文地址:https://www.cnblogs.com/xzlf/p/12683087.html
Copyright © 2020-2023  润新知