2

有没有办法在运行时编译和加载 Java 类,而无需在操作系统文件系统中创建和存储文件?

假设我有一个包含 java 类的字符串表示的数据库记录。我将该字符串拉入 Java 内存。我的目标是将该 String 编译成一个 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

If you can store the bytecode you should be able to do something like what is shown in the Javadoc for ClassLoader. You simply override the findClass(String) method.

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 回答