首页 > 代码库 > java 动态编译

java 动态编译

一、图示:

技术分享

 

二、代码演示

package com.hy;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import org.junit.Test;
/**
 * 
 * @author Administrator
 *
 */
public class Test1 {
    
    @Test
    public void test1() {
        try {
            //把一个文本读入内存
            FileReader fr= new FileReader("C:\\Users\\Administrator\\Desktop\\News2.txt");
            BufferedReader br = new BufferedReader(fr);
            String line = "";
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line);
                sb.append("\n");
            }
            br.close();
            fr.close();
            
            //在某个路径下生成一个java文件
            String path = System.getProperty("user.dir")+"\\src\\com\\hy\\News2.java";
            FileWriter fw = new FileWriter(path);
            fw.write(sb.toString());
            fw.flush();
            fw.close();
            
            //把类编译成class文件
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//获取java编译器
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);//获取一个java文件管理器
            Iterable iterable = fileManager.getJavaFileObjects(path);//生成一个特定的java文件对象
            CompilationTask compilationTask  = compiler.getTask(null, fileManager, null, null, null, iterable);//得到一个编译任务
            compilationTask.call();//编译
            fileManager.close();
            
            //将class载入到内存里面
            URL[] urls = new URL[]{new URL("file:/"+System.getProperty("user.dir")+"/src")};//加载这个路径下面的所有class(网络路径)
            URLClassLoader urlClassLoader = new URLClassLoader(urls);
            Class c = urlClassLoader.loadClass("com.hy.News2");
            System.out.println(c);
            
            
            Constructor constructor = c.getConstructor();//获取构造方法
            News2 news2 = (News2)constructor.newInstance();//使用构造方法得到一个实例
            news2.sayHello();//调用方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

 

注意:这里演示通过代码文本动态生成一个java对象,使用动态编译!

java 动态编译