【发布时间】:2011-09-23 11:23:45
【问题描述】:
由于 URL 类加载器只接受 URL 或文件路径,我如何从存储为 blob 的 jar 文件加载类?
【问题讨论】:
标签: java classloader
由于 URL 类加载器只接受 URL 或文件路径,我如何从存储为 blob 的 jar 文件加载类?
【问题讨论】:
标签: java classloader
从 java.lang.ClassLoader 实现您自己的子类,从数据库中加载。
也许这篇文章有助于入门:http://www.javablogging.com/java-classloader-2-write-your-own-classloader/
【讨论】:
java.security.SecureClassLoader 可能是一个更好的基础。
编写自己的 ClassLoader 可能会非常令人困惑,尤其是对于初学者而言。我最近需要动态加载一些 jar,发现 this answer 非常有帮助。它解释了如何使用 ResourceFinder,一个来自 Apache xbean 的类或其他东西。这是一个可以轻松放入项目的单个文件。
最适合您的情况,尽管 ResourceFinder 通过 URL 加载,readContents 函数(用于实际加载 jar 文件)看起来像这样:
private String readContents(URL resource) throws IOException {
InputStream in = resource.openStream();
BufferedInputStream reader = null;
StringBuilder sb = new StringBuilder();
try {
reader = new BufferedInputStream(in);
int b = reader.read();
while (b != -1) {
sb.append((char) b);
b = reader.read();
}
return sb.toString().trim();
} finally {
try {
in.close();
reader.close();
} catch (Exception e) {
}
}
}
可以很容易地修改它以在您拥有的任何 Stream/blob 上工作。 我敢肯定,对课程进行一些细微的更改可以使其完全按照您的意愿进行,或者至少为您指明正确的方向。从头开始编写 ClassLoader 并不好玩。
编辑: 你知道,我刚刚又看了一遍,我不太确定你是否可以只对 ResourceFinder 进行细微的更改。不过,还是看看吧,看看你能从中得到什么。
【讨论】:
如果您查看JarClassLoader in the Java tutorial 的代码,您就会开始。
如果您使用 Google 搜索 Jar 类加载器,还可以使用其他资源。
您需要修改代码以传入您从数据库中的 BLOB 获得的 ByteStream。
【讨论】:
实现您自己的类加载器是显而易见的答案。取决于您需要如何使用可能有问题的类。另一个鲜为人知的选择是实现您自己的 url 处理程序。你可以想出一个自定义 url 方案,如 "db://<dbname>/<tablename>/<jarfile>" 或其他东西。您将实现一个自定义 URLStreamHandler,详细信息here。
【讨论】:
one way to laod jar file .. it may helpful to you.
public class JarLoad {
public static void main(String[] args) throws ZipException, IOException {
File jarfile = new File("C\\scan.jar");
if(! jarfile.isDirectory()){
ZipFile jar = new ZipFile(jarfile);
Enumeration enumeration = jar.entries();
while(enumeration.hasMoreElements()){
ZipEntry zipEntry = (ZipEntry)enumeration.nextElement();
System.out.println(zipEntry.getName());
}
}
}
}
【讨论】: