Java 5 および Java 6 で (メモリ内の) 任意の文字列から Java コードをコンパイルし、それをロードして、(事前定義された) 特定のメソッドを実行するにはどうすればよいですか?
これを炎上させる前に、既存の実装を調べました。
- ほとんどは Java 6 Compiler API に依存しています。
- そうでないものは、トリックに依存します。
- はい、commons-jci を確認しました。それがどのように機能するかを理解するには密度が高すぎるか、単に理解していないかのどちらかです。
- 現在のクラスパスをコンパイラに供給する方法が見つかりませんでした (これは非常に巨大です)。
- (Java 6 で) 機能した実装では、内部クラス (または内部匿名クラス) を正しくロードする方法が見つかりませんでした。
- 複数の環境で実行されるため、全体がメモリ内にあると非常に気に入っています。
これは以前に解決されたと確信していますが、Googleで半製品の品質でさえ見えるものを見つけることができません(前に言ったように、私は使用できなかったjciを除いて)。
編集:
- 私は JavaAssist を調べました - 内部クラス、Java 5.0 言語レベルのサポート、およびクラスパス全体でのコンパイルが必要です。また、その場で新しいクラスを作成したいと思います。私は間違っているかもしれませんが、JavaAssit でこれを行う方法が見つかりませんでした。
- ファイルシステムベースのソリューション(javacを呼び出す)を使用したいと思っていますが、クラスパスを推測する方法も、後でファイル(クラスパスにない)を特別なクラスローダーでロードする方法もわかりません。複数の呼び出しのためにリサイクルされます。私はそれを調査する方法を知っていますが、私は準備ができている解決策を好みます.
Edit2: 今のところ、BeanShell の「評価」に満足しています。どうやら、必要なことはすべて実行します (文字列を取得し、「現在の」クラスパスのコンテキストで評価します。Java 5 機能の一部が欠けていますが、列挙型 (定義ではなく) とコンパイル済みの「ジェネリック」 (消去された) を使用できます)。 )クラスなので、私が望むものには十分なはずです。
より良い解決策が出てくることを望んでいるので、まだ回答を承認済みとしてマークしたくありません。
Edit3: beanshell の提案を受け入れました - 本当に素晴らしく動作します。