从DB调用类(编译的java文件)文件,并在运行时在应用服务器上执行它

从DB调用类(编译的java文件)文件,并在运行时在应用服务器上执行它,java,oracle,jakarta-ee,jdbc,oracle11g,Java,Oracle,Jakarta Ee,Jdbc,Oracle11g,我要求客户将.class文件作为oracle 11g数据库中的Blob保存(由于.class具有财务批处理和加密逻辑,客户不想将其放在app server上) 我的问题是 是否有可能在应用程序中具有这样的功能,即从DB检索.class文件(编译的java文件)并在调用时执行它 提前感谢。是的,您需要编写一个自定义,使用从数据库读取的字节来定义类 看起来是这样的: public class DatabaseClassLoader extends ClassLoader { private Da

我要求客户将
.class
文件作为
oracle 11g
数据库中的
Blob
保存(由于
.class
具有财务批处理和加密逻辑,客户不想将其放在app server上)

我的问题是

是否有可能在应用程序中具有这样的功能,即从DB检索.class文件(编译的java文件)并在调用时执行它


提前感谢。

是的,您需要编写一个自定义,使用从数据库读取的字节来定义类

看起来是这样的:

public class DatabaseClassLoader extends ClassLoader
{
  private DataSource dataSource;

  public DatabaseClassLoader(ClassLoader parent, DataSource dataSource)
  {
    super(parent);
    this.dataSource = dataSource;
  }

  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException
  {
    byte[] classDefinition = loadClassDefinition(name);

    if (classDefinition != null)
    {
      Class c = defineClass(name, classDefinition, 0, classDefinition.length);
      resolveClass(c);
      return c;
    }
    else
    {
      return super.loadClass(name);
    }
  }

  private byte[] loadClassDefinition(String name)
  {
    ...
  }
}
公共类数据库类加载器扩展类加载器
{
私有数据源;
公共数据库类加载器(类加载器父级、数据源数据源)
{
超级(家长);
this.dataSource=数据源;
}
@凌驾
公共类loadClass(字符串名称)引发ClassNotFoundException
{
字节[]类定义=加载类定义(名称);
if(类定义!=null)
{
c类=定义类(名称,类定义,0,类定义.length);
(c)级;
返回c;
}
其他的
{
返回super.loadClass(名称);
}
}
专用字节[]loadClassDefinition(字符串名称)
{
...
}
}

loadClassDefinition
试图在SQL查询中使用名称作为键来加载表示类的字节时,您必须自己精确地定义它是如何实现的,但大纲是,查询表,将blob读入数组并返回它。

他们确实想将类存储在数据库中,但是从外部应用程序/JVM加载并运行它?他们不想?可以从外部应用程序调用。e、 g.使用PL/SQL过程包装器,但我猜这取决于类将要做什么。在这种情况下,是的,我们需要存储.class文件DB,如果它是批处理文件,我们可以从DB本身运行(但同样需要知道如何运行)如果它与加密有关,则需要在应用程序端执行。您是否可以分享一个示例?谢谢。谢谢,我会尝试一下。