从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本身运行(但同样需要知道如何运行)如果它与加密有关,则需要在应用程序端执行。您是否可以分享一个示例?谢谢。谢谢,我会尝试一下。