如何从数据库加载Java类?

带有以下源代码:

package util.abc;

public class Test{

public String out(){

return "Hello World!";

}

}

我可以用:

Class c = Class.forName("util.abc.Test");

实例化该类,但我必须将此源文件(Test.java)放在类路径中/util/abc/

我想从数据库动态加载此类(将源代码存储为stringbinary

这可能吗 ?

回答:

假设您已经编译了该类,则可以创建一个DatabaseClassLoader,从数据库中加载该类。

public class DatabaseClassLoader extends ClassLoader {

public DatabaseClassLoader(ClassLoader parent, ... /* connection to database */ ) {

super(parent);

// store the connection

}

public Class findClass(String name) {

byte[] data = loadDataFromDatabase(name);

return defineClass(name, data, 0, data.length);

}

private byte[] loadDataFromDatabase(String name) {

// this is your job.

}

}

如果数据库仅包含源代码,则必须首先对其进行编译-查看Java编译器API,了解如何在没有任何文件的情况下执行此操作。

请注意,只要类加载器处于活动状态,以这种方式加载的类就会保持活动状态,因此您需要一个新的类加载器,以便在发生更改时能够重新加载该类。

另外,如果您想通过反射以外的其他方式与类进行交互,则最好让它实现某些接口(其本身在类路径中),并让应用程序类加载器成为数据库类加载器的父级。

嗯,以及如何加载:

Class<?> c = Class.forName("util.abc.Test", myClassLoader);

或直接

Class<?> c = myClassLoader.loadClass("util.abc.Test");


这是一种创建您的接口对象(实际上是任何接口)的方法:

public <X> X getImplementingObject(Class<X> interfaceClass, String className)

throws ClassNotFoundException, IllegalAccessException, InstantiationException

{

ClassLoader loader = new DatabaseClassLoader(interfaceClass.getClassLoader(), ...);

Class<?> cl = loader.loadClass(className);

Class<? extends X> c = cl.asSubclass(interfaceClass);

return c.newInstance();

}

(它需要类具有一个无参数的构造函数,该构造函数当然不会抛出任何异常(如果确实如此,则也会抛出该异常)。

这将为每个此类创建一个新的ClassLoader,因此它们只能通过接口(或反射)相互配合。

对于即时编译,您应该查看Java编译器API,如 dcn 的答案 所述 。但是我认为最好在将类放入数据库的那一侧进行编译,而不是将其拉出数据库。

以上是 如何从数据库加载Java类? 的全部内容, 来源链接: utcz.com/qa/413800.html

回到顶部