Java Jar文件作为流类加载器

时间:2011-09-23 11:23:46

标签: java classloader

如何从作为blob存储在数据库中的jar文件中加载类,因为URL类加载器只接受URL或文件路径?

5 个答案:

答案 0 :(得分:2)

java.lang.ClassLoader实现自己的子类,从数据库加载。

也许这篇文章有助于开始:http://www.javablogging.com/java-classloader-2-write-your-own-classloader/

答案 1 :(得分:2)

编写自己的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。 我确信,课程的一些细微变化可以使它完全符合您的要求,或者至少指向正确的方向。从头开始编写ClassLoaders并不好玩。

编辑:   你知道吗,我刚看了一眼,我不太确定你只能对ResourceFinder进行微小的改动。不过,看一遍,看看你能从中得到什么。

答案 2 :(得分:1)

如果您查看JarClassLoader in the Java tutorial的代码,可以帮助您入门。

如果您使用Google for Jar Class Loader,还可以使用其他资源 您需要修改代码以传入从数据库中的BLOB获取的ByteStream。

答案 3 :(得分:0)

实现自己的类加载器是明显的答案。取决于您需要如何使用可能有问题的类。另一个鲜为人知的选择是实现自己的url处理程序。你可以提出像"db://<dbname>/<tablename>/<jarfile>"之类的自定义网址方案。您将实现自定义URLStreamHandler,详细信息here

答案 4 :(得分:-4)

 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());
        }

    }

}

}