您的位置:首页 > 编程语言 > Java开发

Java 文件级动态编译

2017-11-16 13:46 204 查看
先声明接口:

package Test;
public interface Printer {
public void print();
}


然后:
package Test;

import java.io.File;
import java.io.FileWriter;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class MyTest {
public static void main(String[] args) {
// 写入文件
String newfilename = new File("").getAbsolutePath() + "\\src\\Test\\MyPrint" + Kind.SOURCE.extension;
String string = "package Test; \n" + "public class MyPrint implements Printer{ \n" + "@Override \n"
+ "public void print() { \n" + "System.out.println(\"MyPrint...\"); \n" + "} \n" + "}";
try (FileWriter writer = new FileWriter(newfilename)) {
writer.write(string);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
// 获得编译器
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
// 读入源文件
Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects(newfilename);
// 编译
CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);
if (task.call()) {
// 指定class路径,加载class
try {
fileManager.close();
URL url = new URL("file://E:/workspace/TEST/src/");
URLClassLoader classLoader = new URLClassLoader(new URL[] { url });
Printer printer = (Printer) classLoader.loadClass("Test.MyPrint").newInstance();
classLoader.close();
printer.print();
} catch (Exception e) {
e.printStackTrace();
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class java