Module java.base
Package java.net

Class URLClassLoader

所有已实现的接口:
Closeable, AutoCloseable
直接已知的子类:
MLet

public class URLClassLoader extends SecureClassLoader implements Closeable
该类加载器用于从引用JAR文件和目录的URL搜索路径加载类和资源。任何jar:方案URL(参见JarURLConnection)都被假定为引用JAR文件。任何以'/'结尾的file:方案URL都被假定为引用目录。否则,URL被假定为引用将根据需要打开的JAR文件。

该类加载器支持从给定URL引用的多版本 JAR文件的内容加载类和资源。

创建URLClassLoader实例的线程的AccessControlContext将在随后加载类和资源时使用。

默认情况下,加载的类仅被授予访问创建URLClassLoader时指定的URL的权限。

自 JDK 版本:
1.2
  • Constructor Details

    • URLClassLoader

      public URLClassLoader(URL[] urls, ClassLoader parent)
      为给定URLs创建新的URLClassLoader。在首先在指定的父类加载器中搜索后,将按照指定的顺序搜索类和资源。任何jar:方案URL都被假定为引用JAR文件。任何以'/'结尾的file:方案URL都被假定为引用目录。否则,URL被假定为引用将根据需要下载和打开的JAR文件。

      如果存在安全管理器,则此方法首先调用安全管理器的checkCreateClassLoader方法,以确保允许创建类加载器。

      参数:
      urls - 用于加载类和资源的URLs
      parent - 用于委派的父类加载器
      抛出:
      SecurityException - 如果存在安全管理器且其checkCreateClassLoader方法不允许创建类加载器。
      NullPointerException - 如果urls或其任何元素为null
      参见:
    • URLClassLoader

      public URLClassLoader(URL[] urls)
      使用默认委派父ClassLoader为指定URLs创建新的URLClassLoader。将按照指定的顺序搜索类和资源。在父类加载器中搜索后,将搜索URL。任何以'/'结尾的URL都被假定为引用目录。否则,URL被假定为引用将根据需要下载和打开的JAR文件。

      如果存在安全管理器,则此方法首先调用安全管理器的checkCreateClassLoader方法,以确保允许创建类加载器。

      参数:
      urls - 用于加载类和资源的URLs
      抛出:
      SecurityException - 如果存在安全管理器且其checkCreateClassLoader方法不允许创建类加载器。
      NullPointerException - 如果urls或其任何元素为null
      参见:
    • URLClassLoader

      public URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
      为指定URLs、父类加载器和URLStreamHandlerFactory创建新的URLClassLoader。将使用父类作为委派的父类加载器。将使用工厂参数作为流处理程序工厂,在创建新的JAR URLs时获取协议处理程序。

      如果存在安全管理器,则此方法首先调用安全管理器的checkCreateClassLoader方法,以确保允许创建类加载器。

      参数:
      urls - 用于加载类和资源的URLs
      parent - 用于委派的父类加载器
      factory - 创建URLs时要使用的URLStreamHandlerFactory
      抛出:
      SecurityException - 如果存在安全管理器且其checkCreateClassLoader方法不允许创建类加载器。
      NullPointerException - 如果urls或其任何元素为null
      参见:
    • URLClassLoader

      public URLClassLoader(String name, URL[] urls, ClassLoader parent)
      为指定URLs创建新的命名URLClassLoader。将按照指定的顺序搜索类和资源。任何以'/'结尾的URL都被假定为引用目录。否则,URL被假定为引用将根据需要下载和打开的JAR文件。
      参数:
      name - 类加载器名称;如果未命名,则为null
      urls - 用于加载类和资源的URLs
      parent - 用于委派的父类加载器
      抛出:
      IllegalArgumentException - 如果给定名称为空。
      NullPointerException - 如果urls或其任何元素为null
      SecurityException - 如果存在安全管理器且其SecurityManager.checkCreateClassLoader()方法不允许创建类加载器。
      自 JDK 版本:
      9
    • URLClassLoader

      public URLClassLoader(String name, URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
      为指定URLs、父类加载器和URLStreamHandlerFactory创建新的命名URLClassLoader。将使用父类作为委派的父类加载器。将使用工厂参数作为流处理程序工厂,在创建新的JAR URLs时获取协议处理程序。
      参数:
      name - 类加载器名称;如果未命名,则为null
      urls - 用于加载类和资源的URLs
      parent - 用于委派的父类加载器
      factory - 创建URLs时要使用的URLStreamHandlerFactory
      抛出:
      IllegalArgumentException - 如果给定名称为空。
      NullPointerException - 如果urls或其任何元素为null
      SecurityException - 如果存在安全管理器且其checkCreateClassLoader方法不允许创建类加载器。
      自 JDK 版本:
      9
  • Method Details

    • getResourceAsStream

      public InputStream getResourceAsStream(String name)
      返回用于读取指定资源的输入流。如果此加载器已关闭,则此方法打开的任何资源将被关闭。

      搜索顺序在ClassLoader.getResource(String)的文档中描述。

      覆盖:
      getResourceAsStream 在类 ClassLoader
      参数:
      name - 资源名称
      返回:
      用于读取资源的输入流,如果找不到资源则返回null
      抛出:
      NullPointerException - 如果namenull
      自 JDK 版本:
      1.7
    • close

      public void close() throws IOException
      关闭此URLClassLoader,使其无法再用于加载由此加载器定义的新类或资源。仍然可以访问由此加载器的父加载器在委派层次结构中定义的类和资源。同时,任何已加载的类或资源仍然可以访问。

      对于jar:和file: URL,它还会关闭由它打开的任何文件。如果在调用close方法时另一个线程正在加载一个类,则该加载的结果是未定义的。

      该方法会尽力尝试关闭所有已打开的文件,通过在内部捕获IOException。未捕获的异常和错误不会被捕获。对已关闭的加载器调用close没有任何效果。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果关闭此类加载器打开的任何文件导致IOException。任何此类异常都会在内部捕获。如果只捕获了一个异常,则会重新抛出。如果捕获了多个异常,则会将第二个及后续异常添加为第一个捕获的异常的抑制异常,然后重新抛出。
      SecurityException - 如果设置了安全管理器,并且它拒绝RuntimePermission("closeClassLoader")
      自从:
      1.7
    • addURL

      protected void addURL(URL url)
      将指定的URL附加到要搜索类和资源的URL列表中。

      如果指定的URL为null或已在URL列表中,或者如果此加载器已关闭,则调用此方法没有任何效果。

      参数:
      url - 要添加到URL搜索路径的URL
    • getURLs

      public URL[] getURLs()
      返回用于加载类和资源的URL搜索路径。这包括最初在构造函数中指定的URL列表,以及后来通过addURL()方法附加的任何URL。
      返回:
      用于加载类和资源的URL搜索路径。
    • findClass

      protected Class<?> findClass(String name) throws ClassNotFoundException
      从URL搜索路径中查找并加载具有指定名称的类。任何引用JAR文件的URL都将根据需要加载和打开,直到找到该类。
      覆盖:
      findClass 在类 ClassLoader
      参数:
      name - 类的名称
      返回:
      结果类
      抛出:
      ClassNotFoundException - 如果找不到类,或者加载器已关闭。
      NullPointerException - 如果namenull
    • definePackage

      protected Package definePackage(String name, Manifest man, URL url)
      在此URLClassLoader中按名称定义一个新包。指定的Manifest中包含的属性将用于获取包版本和封闭信息。对于封闭的包,附加的URL指定了加载该包的代码源URL。
      参数:
      name - 包名称
      man - 包含包版本和封闭信息的Manifest
      url - 包的代码源URL,如果没有则为null
      返回:
      新定义的Package对象
      抛出:
      IllegalArgumentException - 如果包名称已被此类加载器定义
    • findResource

      public URL findResource(String name)
      在URL搜索路径上查找具有指定名称的资源。
      覆盖:
      findResource 在类 ClassLoader
      参数:
      name - 资源的名称
      返回:
      资源的URL,如果找不到资源或加载器已关闭,则为null
    • findResources

      public Enumeration<URL> findResources(String name) throws IOException
      返回一个表示URL搜索路径上具有指定名称的所有资源的URL的枚举。
      覆盖:
      findResources 在类 ClassLoader
      参数:
      name - 资源名称
      返回:
      一个URL的枚举。如果加载器已关闭,则枚举不包含任何元素。
      抛出:
      IOException - 如果发生I/O异常
    • getPermissions

      protected PermissionCollection getPermissions(CodeSource codesource)
      返回给定codesource对象的权限。此方法的实现首先调用super.getPermissions,然后根据codesource的URL添加权限。

      如果此URL的协议是"jar",则授予的权限基于Jar文件的URL所需的权限。

      如果协议是"file"并且有一个权限组件,则可能授予连接到该权限组件并接受该权限组件连接的权限。如果协议是"file"并且路径指定了一个文件,则授予读取该文件的权限。如果协议是"file"并且路径是一个目录,则授予读取该目录中包含的所有文件和(递归地)所有文件和子目录的权限。

      如果协议不是"file",则授予连接到URL主机并接受该主机连接的权限。

      覆盖:
      getPermissions 在类 SecureClassLoader
      参数:
      codesource - codesource
      返回:
      授予给codesource的权限
      抛出:
      NullPointerException - 如果codesourcenull
    • newInstance

      public static URLClassLoader newInstance(URL[] urls, ClassLoader parent)
      为指定的URL和父类加载器创建一个新的URLClassLoader实例。如果安装了安全管理器,则此方法返回的URLClassLoader的loadClass方法在加载类之前将调用SecurityManager.checkPackageAccess方法。
      参数:
      urls - 用于搜索类和资源的URL
      parent - 用于委派的父类加载器
      返回:
      结果类加载器
      抛出:
      NullPointerException - 如果urls或其任何元素为null
    • newInstance

      public static URLClassLoader newInstance(URL[] urls)
      为指定的URL和默认父类加载器创建一个新的URLClassLoader实例。如果安装了安全管理器,则此方法返回的URLClassLoader的loadClass方法在加载类之前将调用SecurityManager.checkPackageAccess
      参数:
      urls - 用于搜索类和资源的URL
      返回:
      结果类加载器
      抛出:
      NullPointerException - 如果urls或其任何元素为null