English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
要約
このクラスは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:ファイルオープン中にエラー発生 "+srcPath); } return result; } }
まとめ
これで、本文におけるjavaプログラミングの動的コンパイルおよびロードコードの共有が完了しました。皆様に役立つことを願っています。興味を持たれた方は、本サイトの他の関連するトピックもご覧ください。不十分な点があれば、コメントをお願いします。皆様のサポートに感謝します。
声明:本文の内容はインターネットから取得しており、著作権者はすべて所有しています。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。告発を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害疑いのコンテンツを削除します。)