English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Teilen von Beispieln für dynamische Kompilierung und Laden von Code in Java-Programmierung

概述

该类使用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;
	}
	//Diese Methode erhält den Paketnamen aus der angegebenen Pfad Quelldatei. 
	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: Fehler beim Öffnen der Datei ")+srcPath);
		}
		return result;
	}
}

Zusammenfassung

Das sind alle Inhalte dieses Artikels über die dynamische Kompilierung und das Laden von Code in Java-Programmierung. Hoffentlich hilft es Ihnen weiter. Freunde, die daran interessiert sind, können weiterhin andere verwandte Themen dieser Website lesen. Freuen Sie sich auf Kommentare, die Verbesserungen vorschlagen. Vielen Dank für die Unterstützung der Freunde dieser Website!

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich anstößigen Inhalt entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, um eine Meldung zu senden, und fügen Sie relevante Beweise bei. Sobald überprüft, wird diese Website die beanstandeten urheberrechtlichen Inhalte sofort löschen.)

Empfohlene Artikel