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();
}
}
}
}
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();
}
}
}
}
相关文章推荐
- Java动态编译
- Java动态编译
- Java编译、动行时动态引入lib的方法
- 用java调用编译器编译java文件-马士兵设计模式教程-动态代理 .
- Java学习之 -----动态编译 - DynamicCompile--反射调用
- java compiler API实现java的动态编译
- Java 动态编译(Dynamic Compiling)
- Java的动态编译、动态加载、字节码操作
- Java动态编译执行代码示例
- JAVA动态编译辅助类
- Java动态运行编译好的类两种方法
- java动态编译运行代码
- 动态代理---动态生成java文件并编译成class文件
- 从String中动态(内存中)编译和加载java类
- Java_JAVA6动态编译的问题
- Java300StudyNote(3)-Java动态编译(DynamicCompile)、动态运行、反射调用mian方法、JavaCompiler.run()空指针问题
- Java_java动态编译整个项目
- 动态代理---动态生成java文件并编译成class文件
- 基于阿里开源yugong工具类,动态编译Java源文件
- java 内存编译-动态编译