使用自定义类加载器加载资源束 import java.io.ByteArrayOutputStream; 导入java.io.File; 导入java.io.IOException; 导入java.io.InputStream; 导入java.util.jar.JarEntry; 导入java.util.jar.jar文件; 公共类JarClassLoader扩展了ClassLoader{ 私有字符串路径; 公共类加载器(字符串路径){ this.path=path; } @凌驾 公共类loadClass(字符串名称,布尔解析)引发ClassNotFoundException { c类=findLoadedClass(名称); 如果(c==null){ 试一试{ c=findSystemClass(名称); }捕获(例外e){ } 如果(c!=null) 返回c; 试一试{ 字节数据[]=loadClassData(名称); c=定义类(名称、数据、0、数据长度); 如果(c==null) 抛出新的ClassNotFoundException(名称); 如果(解决) (c)级; }捕获(例外e){ e、 printStackTrace(); } } 返回c; } 私有字节[]装入类数据(字符串类条目)引发IOException{ System.out.println(类条目); 字符串文件名=classEntry.replace('.',File.separatorChar)+“.class”; JarFile jar=新的JarFile(路径); JarEntry=jar.getJarEntry(文件名); InputStream=jar.getInputStream(条目); int数据; ByteArrayOutputStream ByTestStream=新建ByteArrayOutputStream(); 而((data=is.read())!=-1){ ByTestStream.write(数据); } 返回byteStream.toByteArray(); } }

使用自定义类加载器加载资源束 import java.io.ByteArrayOutputStream; 导入java.io.File; 导入java.io.IOException; 导入java.io.InputStream; 导入java.util.jar.JarEntry; 导入java.util.jar.jar文件; 公共类JarClassLoader扩展了ClassLoader{ 私有字符串路径; 公共类加载器(字符串路径){ this.path=path; } @凌驾 公共类loadClass(字符串名称,布尔解析)引发ClassNotFoundException { c类=findLoadedClass(名称); 如果(c==null){ 试一试{ c=findSystemClass(名称); }捕获(例外e){ } 如果(c!=null) 返回c; 试一试{ 字节数据[]=loadClassData(名称); c=定义类(名称、数据、0、数据长度); 如果(c==null) 抛出新的ClassNotFoundException(名称); 如果(解决) (c)级; }捕获(例外e){ e、 printStackTrace(); } } 返回c; } 私有字节[]装入类数据(字符串类条目)引发IOException{ System.out.println(类条目); 字符串文件名=classEntry.replace('.',File.separatorChar)+“.class”; JarFile jar=新的JarFile(路径); JarEntry=jar.getJarEntry(文件名); InputStream=jar.getInputStream(条目); int数据; ByteArrayOutputStream ByTestStream=新建ByteArrayOutputStream(); 而((data=is.read())!=-1){ ByTestStream.write(数据); } 返回byteStream.toByteArray(); } },java,classloader,Java,Classloader,我有一个类加载器(张贴在上面)来从jar中加载我需要的所有类文件。它还包含MySQL java驱动程序文件,当它试图加载这些文件时,我在com.MySQL.jdbc.LocalizedErrorMessages上得到一个错误,因为这是一个ResourceBundle。我的问题是如何使用自定义类加载器加载资源包?谢谢您的帮助。您需要重写并实现findResource()/findResources()方法。这些方法在加载资源包属性文件和其他非类文件时使用。您如何编写自己的Jar类加载器?您已经可以

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

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

您如何编写自己的Jar类加载器?您已经可以这样做了。不确定正在请求或执行什么。调用getBundle的代码可能更有趣。您只需使用
java.net.URLClassLoader.newInstance
@WilliamCarey即可创建一个类加载器:那么就接受这个答案吧!作为一个补充,为了让它为我工作,我必须重写getResource方法,然后在其中调用super.findResource,但是我的类加载器扩展了URLClassLoader,所以不确定这是否是原因。
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();

}

}