Java 使用URLClassLoader动态加载JAR?

Java 使用URLClassLoader动态加载JAR?,java,dynamic,jar,Java,Dynamic,Jar,我有一个程序,需要能够在运行时动态加载JAR——环顾四周后,我相信它使用的是URLClassLoader,但我不确定如何让它工作。JAR“openup.JAR”与程序位于同一目录中 理想情况下我希望能够加载此JAR,而不必指定其中的每个类。我成功使用的内容: @SuppressWarnings("unchecked") public void addURL(URL u) throws IOException { URLClassLoader sysLoader = (URLClassLo

我有一个程序,需要能够在运行时动态加载JAR——环顾四周后,我相信它使用的是URLClassLoader,但我不确定如何让它工作。JAR“openup.JAR”与程序位于同一目录中


理想情况下我希望能够加载此JAR,而不必指定其中的每个类。

我成功使用的内容:

@SuppressWarnings("unchecked")
public void addURL(URL u) throws IOException {
    URLClassLoader sysLoader = (URLClassLoader) ThisClass.class.getClassLoader();
    URL urls[] = sysLoader.getURLs();
    for (int i = 0; i < urls.length; i++) {
        if (urls[i].toString().equalsIgnoreCase(u.toString())) {
            return;
        }
    }
    Class sysclass = URLClassLoader.class;
    try {
        Method method = sysclass.getDeclaredMethod("addURL", parameters);
        method.setAccessible(true);
        method.invoke(sysLoader, new Object[] { u });
    } catch (Throwable t) {
        throw new IOException("Error, could not add URL to system classloader");
    }
}
@SuppressWarnings(“未选中”)
公共void addURL(URL u)引发IOException{
URLClassLoader sysLoader=(URLClassLoader)ThisClass.class.getClassLoader();
URL URL[]=sysLoader.getURL();
for(int i=0;i

一个几乎相同的解决方案确实出现在

可能的副本中,您所说的“加载这个罐子而不必知道里面是什么”的确切含义是什么?那么,你到底想从中装入什么呢?为什么你想装入一个罐子而不知道里面装的是什么?您想将其作为zip文件处理,还是对加载java类感兴趣?抱歉,这句话措词不当——我的意思是,是否可以加载JAR而不必指定要使用的各个类。在我使用的每个JAR中都有100多个类(我需要使用所有这些类)——我的意思是,每个JAR中的每个类都不使用getClass()就可以加载它们吗?在哪里使用这些类?在Java中,类不是通过未知的魔法“加载”的。它们被加载是因为它们在某个地方被引用。到底是什么引用了您希望从该jar加载的类?“干净”的解决方案是创建一个类加载器,该加载器能够加载所讨论的jar,并从一个将jar类加载器设置为其父级的类加载器加载依赖于该jar的类。这看起来是一个糟糕的主意,因为它做出了许多无法保证的假设:1.)ThisClass的类加载器是一个
URLClassLoader
;2.
URLClassLoader
类有一个
addURL
方法(这是您想要的),3.)您可以调用
setAccessible()
(即没有安全管理器正在运行并禁止它)。是的,这是正确的,但在我的例子中效果很好。你有更干净的解决方案吗?谢谢Morja,我想,如果我正确理解了代码,这可能会达到我想要的效果,但如果没有,那仍然是一个答案,所以谢谢你。