仅使用String的动态类加载

时间:2013-09-23 23:54:33

标签: java classloader dynamic-class-loaders

有没有办法在运行时中编译和加载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{}"));

2 个答案:

答案 0 :(得分:2)

是的,我有一个名为OpenHFT/Java-Runtime-Compiler的库代替essence jcf。还有其他图书馆,如beanshell和groovy,支持这一点,但我自己没有使用它们。

答案 1 :(得分:1)

如果您可以存储字节码,那么您应该可以执行ClassLoader的Javadoc中显示的内容。您只需覆盖findClass(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. */
    }

}