【问题标题】:Loading resource bundles using a custom class loader使用自定义类加载器加载资源包
【发布时间】:2011-10-27 22:23:15
【问题描述】:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarClassLoader extends ClassLoader {

private String path;

public JarClassLoader(String path) {
    this.path = path;
}

@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
    Class<?> c = findLoadedClass(name);
    if (c == null) {
        try {
            c = findSystemClass(name);
        } catch (Exception e) {
        }

        if (c != null)
            return c;

        try {

            byte data[] = loadClassData(name);
            c = defineClass(name, data, 0, data.length);

            if (c == null)
                throw new ClassNotFoundException(name);
            if (resolve)
                resolveClass(c);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return c;
}

private byte[] loadClassData (String classEntry) throws IOException {
    System.out.println(classEntry);

    String filename = classEntry.replace('.', File.separatorChar) + ".class";
    JarFile jar = new JarFile(path);
    JarEntry entry = jar.getJarEntry(filename);
    InputStream is = jar.getInputStream(entry);
    int data;
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    while ((data = is.read()) != -1) {
        byteStream.write(data);
    }

    return byteStream.toByteArray();

}

}

我有一个 ClassLoader(上面发布的)可以从 jar 中加载我需要的所有类文件。它还包含 MySQL java 驱动程序文件,当它尝试加载这些文件时,我在 com.mysql.jdbc.LocalizedErrorMessages 上收到错误,因为这是一个 ResourceBundle。我的问题是如何使用自定义类加载器加载资源包?感谢您的帮助。

【问题讨论】:

  • 你是怎么写自己的Jar类加载器的?你已经可以这样做了。
  • 不确定正在询问或完成什么。调用getBundle 的代码可能更有趣。你可以简单地使用java.net.URLClassLoader.newInstance创建一个类加载器。

标签: java classloader


【解决方案1】:

您需要重写并实现 findResource()/findResources() 方法。这些方法在加载资源包属性文件和其他非类文件时使用。

【讨论】:

  • @WilliamCarey:那就接受这个作为答案吧!
  • 作为一个附录,为了让这个对我有用,我必须重写 getResource 方法,然后在其中调用 super.findResource,但我的类加载器扩展了 URLClassLoader,所以不确定这是否是原因。
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 2012-11-08
  • 2015-11-15
  • 2022-06-16
  • 2011-02-12
  • 2013-09-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多