Java中动态编译

在程序中编译其它     .java文件,可以使用JavaCompiler,从程序中调用Java编程语言编译器的接口。

在程序中启动    .class文件,可以使用反射实现。

 

例子:在程序中编译并且运行,一个简单的helloworld程序。

package lrj.annotation;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * 在Java程序中动态编译
 */
public class TestClass {
    public static void main(String[] args) throws Exception {

        //准备好要编译的文件的地址
        String srcDistory = "D:/my_file/";//文件夹目录
        String destFile="Hello.java";//文件名字
        String dest = "Hello";//目标文件:省略后缀.class
        //1.调用Java编程语言编译器的接口JavaCompiler
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        //2.使用run方法开始编译
        int result = compiler.run(null,
                null,
                null,
                srcDistory+destFile);
        System.out.println(result==0?"编译成功":"编译失败");

        //通过反射运行此文件
        try{
            URL[] urls = new URL[]{new URL("file:/"+srcDistory)};
            URLClassLoader loader = new URLClassLoader(urls);
            Class c = loader.loadClass(dest);
            //加载main方法并调用。静态方法可以不指定对象,invcke第一个参数为null。
            c.getMethod("main",String[].class).invoke(null,(Object)new String[]{});
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果:

 

posted @ 2022-11-20 15:39  在博客做笔记的路人甲  阅读(570)  评论(0编辑  收藏  举报