1. Java 动态编译
Java 动态编译是指在程序运行过程中,将源代码(可能来自网络、文件系统或其他非 classpath 的位置)编译成 .class 字节码,并通过类加载器将其加载到 JVM 内存中,以便运行时使用。
Java 提供了 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 函数调用,这个函数要求本地环境中存在JDK ,如果是JRE 环境则无法使用。也就是说这个函数相当于对javac的调用。
通过getTask函数可以创建一个编译任务,
JavaCompiler.CompilationTask getTask(
Writer out,
JavaFileManager fileManager,
DiagnosticListener<? super JavaFileObject> diagnosticListener,
Iterable<String> options,
Iterable<String> classes,
Iterable<? extends JavaFileObject> compilationUnits
)
| 参数 | 类型 | 作用 |
|---|---|---|
| out | Writer | 输出编译信息的地方(编译器消息),可以为 null,默认输出到 System.err |
| fileManager | JavaFileManager | 管理源文件和字节码输出的接口,通常使用 StandardJavaFileManager |
| diagnosticListener | DiagnosticListener<? super JavaFileObject> | 接收编译错误、警告信息,通常为 null(不处理) |
| options | Iterable |
编译选项,例如 -d 输出目录, -classpath 类路径, -encoding UTF-8 |
| classes | Iterable |
指定编译目标类(类名),可为 null,多数场景不使用 |
| compilationUnits | Iterable<? extends JavaFileObject> | 编译单元,源文件对象列表(JavaFileObject 可以是文件或字符串源码) |
该任务不会立即执行,而是通过 boolean success = task.call(); 方法执行并返回结果。
编译后的产物只有class文件,还需要ClassLoade.loadClass("全限定名") 进行加载。

浙公网安备 33010602011771号