java编程进行动态编译加载代码分享
简述
该类使用javax.tools.ToolProvider自带的JavaCompiler进行编译,使用IO的File及NIO的Files进行对应的路径创建、读取及拷贝,使用正则表达式进行包名与目录的转换,我只是将这些东西做了个容错整合,没什么技术含量,就为个方便吧。
模块API
classDynamicReactor://空参构造 publicClass>dynamicCompile(StringsrcPath);//输入一个指定的源文件路径,若编译、拷贝成功则返回该类对应的Class类实例 privateStringchangePacketToDic(StringpackageName);//将一个合法的包名转换为对应JavaClassPath中的路径(我是用的是eclipse所以需要对应地增加bin这一目录,若使用其他不同编译器,请参考对应的运行上下文设置进行适当修改) privateStringgetPackage(StringsrcPath);//由一个合法的java文件路径尝试获得其包名
源代码
importjava.io.BufferedReader; importjava.io.File; importjava.io.FileReader; importjava.io.IOException; importjava.nio.file.Files; importjava.nio.file.Path; importjava.nio.file.Paths; importjava.nio.file.StandardCopyOption; importjava.util.regex.Matcher; importjava.util.regex.Pattern; importjavax.tools.JavaCompiler; importjavax.tools.ToolProvider; /** *DynamicReactor一个动态编译模块,负责编译源文件,复制到对应包下及加载类等过程(JDK1.7) *@author三向板砖 **/ publicclassDynamicReactor{ JavaCompilercompiler; PatternpackagePattern; staticfinalStringregEx="(?<=package\\s).*(?=;)"; publicDynamicReactor() { compiler=ToolProvider.getSystemJavaCompiler(); packagePattern=Pattern.compile(regEx); } /** *动态编译给定源文件 *@paramsrcPath源文件路径 *@returnClass *
若成功返回对应类的Class实例 *
若失败返回null **/ publicClass>dynamicCompile(StringsrcPath) { Class>result=null; //获得给定路径源文件的 StringpackName=getPackage(srcPath); if(packName==null) { System.out.println("DynamicRector:LoadpackageNameError!"); returnnull; } //调用compiler编译指定源文件 intres=compiler.run(null,null,null,srcPath); if(res!=0) { System.out.println("DynamicRector:CompileJavaSourceError!"); returnnull; } //获得包名对应的路径,若路径不存在则创建,若指定class文件存在则覆盖 StringpackageDst=changePacketToDic(packName); FiledstDir=newFile(packageDst); if(!dstDir.exists()) { dstDir.mkdirs(); } PathpathFrom=Paths.get(srcPath.split("\\.java")[0]+".class"); PathpathTo=Paths.get(packageDst,pathFrom.getFileName().toString()); try{ Files.move(pathFrom,pathTo,StandardCopyOption.REPLACE_EXISTING); } catch(IOExceptione){ System.out.println("DynamicRector:MoveFileFail!"); e.printStackTrace(); } try{ result=Class.forName(packName+"."+pathFrom.getFileName().toString().split("\\.class")[0]); } catch(ClassNotFoundExceptione){ System.out.println("DynamicRector:ClassNotfoundinFinal!"); } returnresult; } //该方法将一个合法包名转化为对应路径 privateStringchangePacketToDic(StringpackageName) { String[]dirs=packageName.split("\\."); Stringres=".\\bin"; for(inti=0;i总结
以上就是本文关于java编程进行动态编译加载代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。