質問

Java 5およびJava 6で(メモリ内の)任意の文字列からJavaコードをコンパイルし、ロードして特定のメソッドを実行するには(事前定義済み)

これを実行する前に、既存の実装を確認しました:

  • ほとんどがJava 6コンパイラAPIに依存しています。
  • しない人は、トリックに依存します。
  • はい、commons-jciをチェックアウトしました。私はそれがどのように機能するかを理解するには密度が高すぎるか、そうではありません。
  • コンパイラに現在のクラスパスを渡す方法が見つかりませんでした(これは非常に巨大です)。
  • (Java 6で)動作する実装では、内部クラス(または内部匿名クラス)を正しくロードする方法が見つかりませんでした。
  • Thingが複数の環境で実行されるため、Thing全体がメモリ内にある場合、非常に気に入っています。

これは以前に解決されたと確信していますが、グーグルで半製品品質に見えるものは見つかりません(以前に言ったように、私は使用することができなかったjciを除く) 。

編集:

  • JavaAssistを見ました-内部クラス、Java 5.0言語レベルのサポート、およびクラスパス全体でのコンパイルが必要です。また、その場で新しいクラスを作成したいと思います。私 間違っているかもしれませんが、JavaAssitでこれを行う方法が見つかりませんでした。
  • ファイルシステムベースのソリューション(javacを呼び出す)を使用したいのですが、クラスパスを占う方法も、特別なクラスローダーを使用して(クラスパスにない)ファイルを後で読み込む方法もわかりません複数の呼び出しにリサイクルできます。私はそれを研究する方法を知っていますが、私はすぐに使える解決策を好むでしょう。

Edit2: 今のところ、私はBeanShellの「評価」に満足しています。どうやら必要なことはすべて実行されているようです(文字列を取得し、「現在の」クラスパスのコンテキストで評価します。Java5の機能の一部は見逃しますが、列挙型(定義なし)およびコンパイルされた「汎用」(消去済み)クラスなので、私が望むものには十分なはずです。

より良い解決策が出てくることを望んでいるので、答えをまだ承認済みとしてマークしたくありません。

Edit3:Beanshellの提案を受け入れました-本当に素晴らしい動作をします。

役に立ちましたか?

解決

コンパイルに完全に縛られていない場合、Beanshell、groovy、およびその他のスクリプト言語などのソリューションは簡単に埋め込まれます(実際、javaはスクリプト言語のプラグインをサポートしているため、コードはスクリプトが書かれている言語を知っている)

Beanshellは100%JavaコードIIRCを実行する必要があり、GroovyはほとんどすべてのJavaコード(おそらくすべて)を実行できると思います。

他のヒント

JCIは正常に見えます。このコードスニペットがベースになります:

JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");

MemoryResourceReader mrr = new MemoryResourceReader();
mrr.add("resource name string", yourJavaSourceString.getBytes());

MemoryResourceStore mrs = new MemoryResourceStore();

CompilationResult result = compiler.compile(sources, mrr, mrs);

// don't need the result, unless you care for errors/warnings
// the class should have been compiled to your destination dir

これが機能しない理由は何ですか?


編集: MemoryResourceStore を追加して、要求されたように、コンパイルされたクラス出力をメモリに送信します。

また、ケースのクラスパスなどの javac 設定の設定は、 JavacJavaCompilerSettings <の setCustomArguments(String [] pCustomArguments) / code>クラス。

Janinoもチェックアウトすることをお勧めします。

ウェブサイトから:

Janinoは、JavaTM式、ブロック、クラス本体、ソースファイルまたはソースファイルのセットを読み取り、直接ロードおよび実行されるJavaTMバイトコードを生成するコンパイラです。 Janinoは開発ツールではなく、ランタイムコンパイルを目的とした組み込みコンパイラです。式エバリュエーターまたは「サーバーページ」 JSPなどのエンジン。

http://www.janino.net/

現在、非常に大規模なミッションクリティカルなプロジェクトで使用していますが、問題なく動作します

Javassist に興味があるかもしれません

TomcatなどのWebコンテナ内で実行し、最初にJSPページを生成してから呼び出します。

これにより、クラスローダーを徐々にフルに実行する代わりに、JSPページを上書きするだけで、古いクラス定義を削除することもできます。

は「メモリ内」です速度またはコードベースを変更しないために必要ですか?

ECJ Eclipse Javaコンパイラ

Eclipseは、javacではない独自のコンパイラを提供および使用しています

  • IDE内でEclipseコンパイラが使用されています(Eclipse)
  • Eclipseコンパイラーは、純粋なバッチコンパイラーとしても使用できます。 Eclipseの外部

ソースファイルのコンパイル

$ java -jar ecj-3.5.2.jar HelloWorld.java

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top