Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用类加载器时如何加载资源?_Java_Resources_Bcel - Fatal编程技术网

Java 使用类加载器时如何加载资源?

Java 使用类加载器时如何加载资源?,java,resources,bcel,Java,Resources,Bcel,我使用JarFile和JarURLConnection从jar文件中加载文件。然后我获取这些类,并通过BCEL(字节码工程库,apache库)加载它们。我不能直接使用类加载器,因为我用BCEL稍微修改了一些类。我需要将类按字节加载到我的bcel加载器中。但是,我正在加载的一个类引用了一个资源。该资源位于jar内部,因此我可以获取该文件(当迭代jar文件中的条目时,我忽略常规文件,并获取类文件以供稍后加载)。但是仅仅拥有该文件对我没有任何好处,因为类将其作为资源加载。有没有什么方法可以从jar中获

我使用JarFile和JarURLConnection从jar文件中加载文件。然后我获取这些类,并通过BCEL(字节码工程库,apache库)加载它们。我不能直接使用类加载器,因为我用BCEL稍微修改了一些类。我需要将类按字节加载到我的bcel加载器中。但是,我正在加载的一个类引用了一个资源。该资源位于jar内部,因此我可以获取该文件(当迭代jar文件中的条目时,我忽略常规文件,并获取类文件以供稍后加载)。但是仅仅拥有该文件对我没有任何好处,因为类将其作为资源加载。有没有什么方法可以从jar中获取资源(我可以将它加载到一个字节[],下一部分就是问题所在)并动态添加它作为程序的资源,这样我加载的类就不会丢失它们的资源

这里有很多东西,如果有什么让人困惑的地方,请在评论中询问,我可能说错了什么,或者遗漏了什么:)谢谢

我将在这里展示一些我的类加载器(扩展类加载器):

现在,它正在打印“LOADING RESOURCE:filename”,但随后它给了我一个错误的FormedUrlexception(我没有协议atm,只有一个文件路径,这不是一个真正有效的路径,但它只是试图将它提供给下面的处理程序类)

类处理程序扩展了URLStreamHandler{

@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*/;
        }

    };
}