温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java编程如何进行动态编译加载

发布时间:2021-08-05 14:09:00 来源:亿速云 阅读:187 作者:小新 栏目:编程语言

小编给大家分享一下java编程如何进行动态编译加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

简述

该类使用javax.tools.ToolProvider自带的JavaCompiler进行编译,使用IO的File及NIO的Files进行对应的路径创建、读取及拷贝,使用正则表达式进行包名与目录的转换,我只是将这些东西做了个容错整合,没什么技术含量,就为个方便吧。

模块API

class DynamicReactor://空参构造  public Class<?> dynamicCompile(String srcPath);//输入一个指定的源文件路径,若编译、拷贝成功则返回该类对应的Class类实例  private String changePacketToDic(String packageName);//将一个合法的包名转换为对应JavaClassPath中的路径(我是用的是eclipse 所以需要对应地增加bin这一目录,若使用其他不同编译器,请参考对应的运行上下文设置进行适当修改)  private String getPackage(String srcPath);//由一个合法的java文件路径尝试获得其包名

源代码

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /**   * DynamicReactor 一个动态编译模块,负责编译源文件,复制到对应包下及加载类等过程(JDK 1.7)   * @author 三向板砖   * */ public class DynamicReactor {	JavaCompiler compiler;	Pattern packagePattern;	static final String regEx = "(?<=package\\s).*(?=;)";	public DynamicReactor() 	  {	compiler = ToolProvider.getSystemJavaCompiler();	packagePattern = Pattern.compile(regEx);	}	/**     * 动态编译给定源文件     * @param srcPath 源文件路径     * @return Class     *   <br>若成功返回对应类的Class实例     *   <br>若失败返回null     * */	public Class<?> dynamicCompile(String srcPath) 	  {	Class<?> result = null;	//获得给定路径源文件的 	String packName = getPackage(srcPath);	if(packName == null) 	    {	System.out.println("DynamicRector:Load packageName Error!");	return null;	}	//调用compiler编译指定源文件 	int res = compiler.run(null, null, null,srcPath);	if(res != 0) 	    {	System.out.println("DynamicRector:Compile Java Source Error!");	return null;	}	//获得包名对应的路径,若路径不存在则创建,若指定class文件存在则覆盖 	String packageDst = changePacketToDic(packName);	File dstDir = new File(packageDst);	if(!dstDir.exists()) 	    {	dstDir.mkdirs();	}	Path pathFrom = Paths.get(srcPath.split("\\.java")[0] + ".class");	Path pathTo = Paths.get(packageDst,pathFrom.getFileName().toString());	try {	Files.move(pathFrom, pathTo, StandardCopyOption.REPLACE_EXISTING);	}	catch (IOException e) {	System.out.println("DynamicRector:Move File Fail!");	e.printStackTrace();	}	try {	result = Class.forName(packName+"."+pathFrom.getFileName().toString().split("\\.class")[0]);	}	catch (ClassNotFoundException e) {	System.out.println("DynamicRector:Class Not found in Final!");	}	return result;	}	//该方法将一个合法包名转化为对应路径 	private String changePacketToDic(String packageName) 	  {	String[] dirs = packageName.split("\\.");	String res = ".\\bin";	for (int i = 0;i < dirs.length;i++) 	    {	res += "\\"+dirs[i];	}	return res;	}	//该方法从给定的路径源文件中获得包名 	private String getPackage(String srcPath) 	  {	String result = null;	BufferedReader br;	try {	br = new BufferedReader(new FileReader(srcPath));	String data = br.readLine();	while(data != null) 	      {	if(data.indexOf("package") != -1) 	        {	Matcher m = packagePattern.matcher(data);	if(m.find()) 	          {	result = m.group();	}	break;	}	data = br.readLine();	}	br.close();	}	catch (IOException e) {	System.out.println("DynamicRector:Error in open file "+srcPath);	}	return result;	} }

以上是“java编程如何进行动态编译加载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI