java 动态编译

Posted hy7873

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 动态编译的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

java 动态片段实例化

79 动态编译与动态运行

JAVA之AOP

动态编译JAVA代码并执行

Java动态编译