2

クラスのメモリ内「コンパイル」に関する私の古い質問を再訪したいと思います。私が尋ねてから約 1/2 年が経過したので (そしていくらか回答がありました)、私は問題を再提起し、何か新しいものが出てくるかどうかを確認したいと思います (いいえ、私はこれを重複とは見なしません) .

古い質問はここにあります: On-the-fly, in-memory Java code compilation for Java 5 and Java 6 - この質問に答える前に、それ (および回答) を読むことをお勧めします。

私は、Beanshell が Java クラスの文字列を実際の Class オブジェクトに評価するという重い作業を行っていることに非常に満足しています。しかし、beanshell は長い間バージョン 2.0b4 のままであり、その制限 (コンストラクターもデフォルトもありません。ジェネリックも for-each も enum もありません...) が厄介です。

注意 - これはデバッグ インターフェイスとして使用されるため、パフォーマンスに関する考慮事項は無視できます。ただし、サーバーを再起動することも、クラス ファイルをその場所に送信することもできず、JSP は私にとって非常に悪い選択です (理由についてはここでは説明しません)。また、最終製品はクラス (またはそのクラスのオブジェクト) でなければならないので、それを渡すことができます。

いくつかの制限: 私は JDK を持つことができないので、javax.tools.JavaCompiler はありません。Tomcat やその他の「実際の」Web コンテナーがないため、JSP を使用できません。Java 5 構文のサポート、特にジェネリック、列挙型、およびパラメーター化のサポートは素晴らしいでしょう。デフォルトのコンストラクターのサポートは非​​常に優れています。

何か案は?

編集 1:beanshell でコンストラクターを使用するラウンド アバウトな方法があることがわかりましたが、通常の方法ではなく「public void XXX(){...}」と宣言する必要があります。 ...}".

4

5 に答える 5

2

ライセンス上の理由で SUN JDK tools.jar をバンドルできない場合は、代わりに Eclipse JDT Core コンパイラを含めることができます。

http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm

これは、たとえば、Jetty Web サーバーの JSP 実装が行うことです。

于 2009-11-24T21:26:45.257 に答える
0

クラス/オブジェクトを生成するJava文字列でなければならない特定の理由はありますか?私の自発的な反応は、JRubyがあなたが探しているものであるということです-それは非常に堅実なプラットフォームのようであり、Rubyにはメタプログラミングの強い伝統があります。

于 2009-11-25T08:29:35.687 に答える
0

結局、Bean Shell を使用しました。完璧ではありませんが、問題の 99% を解決しました。

于 2011-05-26T13:42:59.907 に答える
0

tools.jar にコピーして javax.tools.JavaCompiler を取得し、それをクラスパスに追加することはできませんか? それともライセンスの問題ですか?

このコードと、クラスパス上の tools.jar は機能しているようです。

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


public class Main
{
    public static void main(final String[] argv)
        throws IOException
    {
        final File[]                             files;
        final JavaCompiler                       compiler;
        final StandardJavaFileManager            fileManager;
        final Iterable<? extends JavaFileObject> compilationUnits;

        files = new File[]
        {
            new File(argv[0]),
        };        
        compiler         = ToolProvider.getSystemJavaCompiler();
        fileManager      = compiler.getStandardFileManager(null, null, null);
        compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));

        compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
        fileManager.close();
    }
}
于 2009-11-24T20:28:28.947 に答える
0

Java 1.4 が大流行していたずっと前に、Bytecode Engineering Library (BCEL) について読んだことを覚えています。http://jakarta.apache.org/bcel/index.htmlを参照してください。私はそれを使用したことがないので、あなたが求めているものに近いと思われるため(そして、古いVMで動作するか、少なくとも動作する)、まだ誰も言及していないので、言及するだけです.

于 2009-11-24T23:44:37.260 に答える