当前位置: 首页 > 面试题库 >

如何从数据库加载Java类?

董飞航
2023-03-14
问题内容

带有以下源代码:

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 的答案 所述 。但是我认为最好在将类放入数据库的那一侧进行编译,而不是将其拉出数据库。



 类似资料:
  • 问题内容: 是否可以使用Custom Spring PropertyPlaceholderConfigurer从数据库加载属性?提供给自定义PropertyPlaceholderConfigurer的数据源是否有可能在类路径中使用特定的属性文件? 我无法通过以下链接找到满意的答案? http://www.mkyong.com/spring/spring-propertyplaceholdercon

  • 问题内容: 我知道如何从Java数据库中检索数据(只是表中的文本),以及如何在控制台中显示数据。但我想将其加载到JTable中。有没有使用Vector的良好(现代)方法(教程)? 问题答案: 查看本教程:如何使用表

  • 问题内容: 我正在尝试使用Java + Hibernate + Spring将CSV文件加载到mySQL数据库中。我在DAO中使用以下查询来帮助我加载到数据库中: 我有一些想法可以从http://dev.mysql.com/doc/refman/5.1/en/load- data.html 使用它,以及如何从hibernate +spring应用程序将csv文件导入到mysql中? 但是我得到了错

  • 是否可以用Camunda从数据库中加载BPMN XML,而不是在web应用程序中使用文件中的XML? 我们希望能够动态地添加新的工作流,而不是用定义部署新的WAR,这个想法是添加到数据库中,并通知webapp有新的定义。 谢谢,斯科特。

  • 我正在研究一个血液供应链的模拟,并创建和导入了一些表来管理各种代理群体的主数据,如血液处理中心、检测中心、医院等。这些表包含所述代理的名称和lat/lon坐标。 这些表都是MySQL数据库的一部分,我用它的接口连接到AnyLogic,正如我所说,导入了这些表。到目前为止还不错,但是,当我想为每个数据库条目创建代理群体并将代理的参数分配到表的各个字段时,AnyLogic不能将名称(在MySQL中为V