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("全限定名") 进行加载。

posted @ 2025-09-25 23:36  听风讲故事~  阅读(5)  评论(0)    收藏  举报