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