zoukankan      html  css  js  c++  java
  • 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 }

    运行测试:

    重视基础,才能走的更远。
  • 相关阅读:
    在路上。。。
    DNN模块打包(DNN-ModulePack简称为DNNMP)
    创建一个PortalSettings,这也行。
    对Web 2.0 的体验
    太空旅客 第七位 了
    计划今年每月至少写一篇技术性文章
    检索 COM 类工厂中 CLSID 为 {0002450000000000C000000000000046} 的组件时失败,原因是出现 以下错误: 80070005
    RadGrid RaisePostBackEvent 刷新页面问题。
    做为团队中的一员
    dnn captcha 图片 显示不了 见鬼了
  • 原文地址:https://www.cnblogs.com/xzlf/p/12683087.html
Copyright © 2011-2022 走看看