Java 使用类加载器时如何加载资源?
我使用JarFile和JarURLConnection从jar文件中加载文件。然后我获取这些类,并通过BCEL(字节码工程库,apache库)加载它们。我不能直接使用类加载器,因为我用BCEL稍微修改了一些类。我需要将类按字节加载到我的bcel加载器中。但是,我正在加载的一个类引用了一个资源。该资源位于jar内部,因此我可以获取该文件(当迭代jar文件中的条目时,我忽略常规文件,并获取类文件以供稍后加载)。但是仅仅拥有该文件对我没有任何好处,因为类将其作为资源加载。有没有什么方法可以从jar中获取资源(我可以将它加载到一个字节[],下一部分就是问题所在)并动态添加它作为程序的资源,这样我加载的类就不会丢失它们的资源 这里有很多东西,如果有什么让人困惑的地方,请在评论中询问,我可能说错了什么,或者遗漏了什么:)谢谢 我将在这里展示一些我的类加载器(扩展类加载器): 现在,它正在打印“LOADING RESOURCE:filename”,但随后它给了我一个错误的FormedUrlexception(我没有协议atm,只有一个文件路径,这不是一个真正有效的路径,但它只是试图将它提供给下面的处理程序类) 类处理程序扩展了URLStreamHandler{Java 使用类加载器时如何加载资源?,java,resources,bcel,Java,Resources,Bcel,我使用JarFile和JarURLConnection从jar文件中加载文件。然后我获取这些类,并通过BCEL(字节码工程库,apache库)加载它们。我不能直接使用类加载器,因为我用BCEL稍微修改了一些类。我需要将类按字节加载到我的bcel加载器中。但是,我正在加载的一个类引用了一个资源。该资源位于jar内部,因此我可以获取该文件(当迭代jar文件中的条目时,我忽略常规文件,并获取类文件以供稍后加载)。但是仅仅拥有该文件对我没有任何好处,因为类将其作为资源加载。有没有什么方法可以从jar中获
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
}
@Override
public InputStream getInputStream() throws IOException {
System.out.println("IS: " + url);
return /*method to get input steam*/;
}
};
}
}
获取输入steam*/的/*方法是在我的实际代码中设置的,但在这里并不相关。有没有进一步的想法?您尝试过Classloader的getResourceAsStream()吗?大概BCEL正在使用它自己的类加载器,您需要找到一种方法将资源引用添加到该类加载器中classloader@mazaneicha我不想自己去拿文件,我能做到。我加载的一个类,我想他已经在使用getResourceAsStream()。@MadProgrammer我正在使用自己的自定义类加载器类(扩展类加载器)加载这些类。然而,我不确定这对我有什么帮助。我知道我可以重写getResource方法,但是它们返回一个URL,我有一个字节[](或者JarEntry,如果有帮助的话),这不是系统类加载器(不确定是否有办法将其设置为这样)。此外,使用BCEL,我可以设置类存储库,Repository是一个抽象类,它的方法之一是getClassPath,但也没有帮助,因为没有指向资源的路径,只有数据。好吧,我刚刚成功地将我的类加载器设置为系统类加载器,可以覆盖getResource来打印出它试图获取资源,并且在我运行它时它确实打印了出来,但是我会返回什么URL来表示数据,而不是特定的路径?
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
}
@Override
public InputStream getInputStream() throws IOException {
System.out.println("IS: " + url);
return /*method to get input steam*/;
}
};
}