1700439740
1700439741
}
1700439742
1700439743
//文本中的Java对象
1700439744
1700439745
class StringJavaObject extends SimpleJavaFileObject{
1700439746
1700439747
//源代码
1700439748
1700439749
private String content=””;
1700439750
1700439751
//遵循Java规范的类名及文件
1700439752
1700439753
public StringJavaObject(String_javaFileName, String_content){
1700439754
1700439755
super(_createStringJavaObjectUri(_javaFileName),Kind.SOURCE);
1700439756
1700439757
content=_content;
1700439758
1700439759
}
1700439760
1700439761
//产生一个URL资源路径
1700439762
1700439763
private static URI_createStringJavaObjectUri(String name){
1700439764
1700439765
//注意此处没有设置包名
1700439766
1700439767
return URI.create(“String:///”+name+Kind.SOURCE.extension);
1700439768
1700439769
}
1700439770
1700439771
//文本文件代码
1700439772
1700439773
@Override
1700439774
1700439775
public CharSequence getCharContent(boolean ignoreEncodingErrors)
1700439776
1700439777
throws IOException{
1700439778
1700439779
return content;
1700439780
1700439781
}
1700439782
1700439783
}
1700439784
1700439785
上面的代码较多,这是一个动态编译的模板程序,读者可以拷贝到项目中使用,代码中的中文注释也较多,相信读者看得懂,不多解释,读者只要明白一件事:只要是在本地静态编译能够实现的任务,比如编译参数、输入输出、错误监控等,动态编译就都能实现。
1700439786
1700439787
Java的动态编译对源提供了多个渠道。比如,可以是字符串(例子中就是字符串),可以是文本文件,也可以是编译过的字节码文件(.class文件),甚至可以是存放在数据库中的明文代码或是字节码。汇总成一句话,只要是符合Java规范的就都可以在运行期动态加载,其实现方式就是实现JavaFileObject接口,重写getCharContent、openInputStream、openOutputStream,或者实现JDK已经提供的两个SimpleJavaFileObject、ForwardingJavaFileObject,具体代码可以参考上个例子。
1700439788
1700439789
动态编译虽然是很好的工具,让我们可以更加自如地控制编译过程,但是在我目前所接触的项目中还是使用得较少。原因很简单,静态编译已经能够帮我们处理大部分的工作,甚至是全部的工作,即使真的需要动态编译,也有很好的替代方案,比如JRuby、Groovy等无缝的脚本语言。
[
上一页 ]
[ :1.70043974e+09 ]
[
下一页 ]