Java Compiler API
在Java 6中javax.tools提供了标准的包来操作Java编译器,使得我们可以在程序运行期中动态加载Java类,来实现个性化的操作。实际应用可以在一些业务变化多的服务中,将共同操作抽象出来后,再针对不同业务场景动态加载编写的有业务属性的逻辑。
以一个简单的实际例子:
新建抽象基础类:JavaDynamicScript
1 | public abstract class JavaDynamicScript { |
编写动态类代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import com.jinzl.compiler.dto.JavaDynamicScript;
import java.util.Map;
public class HelloWorldScript extends JavaDynamicScript {
private String content;
public Object script(Map<String, Object> context) {
System.out.println("脚本开始执行");
System.out.println("内部变量content: " + content);
System.out.println("执行上下文context: " + context);
System.out.println("脚本结束执行");
return content;
}
}
包装JavaCompilier
1 | public class JavaCodeCompiler { |
使用 ToolProvider.getSystemJavaCompiler() 拿到JavaCompiler接口的实例。
这里还需要提供文件管理服务类1
2
3
4
5
6
7
8
9
10
11
12
13
14public class StringJavaFileObject extends SimpleJavaFileObject {
private String contents;
public StringJavaFileObject(String path, String className, String contents){
super(URI.create(path + ":///" + className.replaceAll("\\.", "/") + Kind.SOURCE.extension), Kind.SOURCE);
this.contents = contents;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
return contents;
}
}