1700439738
1700439739
}
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,具体代码可以参考上个例子。
[
上一页 ]
[ :1.700439738e+09 ]
[
下一页 ]