2

オペレーティング システムのファイル システムにファイルを作成して格納することなく、実行時に Java クラスをコンパイルしてロードする方法はありますか?

Java クラスの文字列表現を含むデータベース レコードがあるとします。その文字列を Java メモリにプルします。私の目標は、その文字列を Java クラスにコンパイルしてから、そのクラスをロードすることです。

これを明確にさせてください。どのオペレーティング システムでも、.java ファイルや .class ファイルとは何の関係もありません。

これは可能ですか?そしてどうやって?

たとえば、実行時に Groovy クラスをロードし、メソッドを呼び出すコードを次に示します。

ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy"));

// let's call some method on an instance
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("run", args);

しかし、私たちは次のようなことをすることができます:

    ClassLoader parent = getClass().getClassLoader();
    GroovyClassLoader loader = new GroovyClassLoader(parent);
    Class groovyClass = loader.parseClass(new String("public class GroovyClass{}"));

?

4

2 に答える 2

2

はい、私はこれを行うOpenHFT/Java-Runtime-Compilerと呼ばれる本質的な jcfを置き換えるライブラリを持っています。これをサポートするbeanshellやgroovyなどの他のライブラリもありますが、私はそれらを自分で使用していません。

于 2013-09-23T23:59:13.510 に答える
1

バイトコードを保存できる場合は、Javadoc に示されているようなことができるはずですClassLoaderfindClass(String)メソッドをオーバーライドするだけです。

public MyClassLoader extends ClassLoader {

    public Class findClass(String name) {
        byte[] b = fetchClassFromDB(String name);
        return defineClass(name, b, 0, b.length);
    }

    private byte[] fetchClassFromDB(String name) {
         /* Look up class in your database and return it as a byte array. */
    }

}
于 2013-09-24T00:46:44.570 に答える