基本的に、バイトコードを操作せずに実行中に新しいクラス ファイルを作成できるかどうか疑問に思っていました。(ASM、BCEL など)。私は、txtファイルを.javaファイルに変換してからコンパイルするという行に沿って何かを考えていました。
4 に答える
その .java ファイルを作成し、ランタイムでコンパイルできます。例えば:
String fileToCompile = "test" + java.io.File.separator +"MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
if(compilationResult == 0){
System.out.println("Compilation is successful");
}else{
System.out.println("Compilation Failed");
}
}
ただし、これはランタイム環境が JDK の場合にのみ機能します。もちろん、javac 関数を使用してこれを処理することもできます。
Javassistを見てください。
他の同様のバイトコード エディタとは異なり、Javassist はソース レベルとバイトコード レベルの 2 つのレベルの API を提供します。ユーザーがソースレベル API を使用すると、Java バイトコードの仕様を知らなくてもクラス ファイルを編集できます。
動的プロキシの使用を検討してください。ドキュメントから:
動的プロキシ クラス (以下、単にプロキシ クラスと呼ぶ) は、クラスの作成時に実行時に指定されたインターフェイスのリストを実装するクラスであり、次のような動作をします。プロキシ インターフェイスは、プロキシ クラスによって実装されるインターフェイスです。プロキシ インスタンスは、プロキシ クラスのインスタンスです。各プロキシ インスタンスには、InvocationHandler インターフェイスを実装する呼び出しハンドラ オブジェクトが関連付けられています。
はい、可能ですが、どのテクノロジーを選択するかは、何をしようとしているかによって異なります。実際の Java コードの作成は含まれない場合があります。たとえば、JVM で実行されるスクリプト言語 (Groovy、Scala、Clojure、Jython、jRuby、Javascript) のいずれかを記述でき、これらはバイト コードにコンパイルできます。Groovy は Java 構文に最も近いものです。ここでの大きな利点は、バイトコードが解釈されるため、バイトコードをリロードせずに変更して再実行できることです。ただし、ほとんどのオプションには、速度のためにバイトコードのコンパイルがあります。