URLClassLoader
java.lang.Object
|—java.lang.ClassLoader
|—|—java.security.SecureClassLoader
|—|—|—java.net.URLClassLoader
public class URLClassLoader
extends SecureClassLoader
implements Closeable
此类加载器用于从引用 JAR 文件和目录的 URL 的搜索路径加载类和资源。 假设任何以“/”结尾的 URL 都指向一个目录。 否则,假定 URL 引用将根据需要打开的 JAR 文件。
创建 URLClassLoader 实例的线程的 AccessControlContext 将在随后加载类和资源时使用。
默认情况下,加载的类仅被授予访问在创建 URLClassLoader 时指定的 URL 的权限。
构造函数摘要
构造函数 | 描述 |
---|---|
URLClassLoader(URL[] urls) | 使用默认委托父 ClassLoader 为指定的 URL 构造一个新的 URLClassLoader。 |
URLClassLoader(URL[] urls, ClassLoader parent) | 为给定的 URL 构造一个新的 URLClassLoader。 |
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) | 为指定的 URL、父类加载器和 URLStreamHandlerFactory 构造一个新的 URLClassLoader。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
protected void | addURL(URL url) | 将指定的 URL 附加到 URL 列表以搜索类和资源。 |
void | close() | 关闭此 URLClassLoader,使其不能再用于加载此加载器定义的新类或资源。 |
protected Package | definePackage(String name, Manifest man, URL url) | 在此 ClassLoader 中按名称定义新包。 |
protected Class<?> | findClass(String name) | 从 URL 搜索路径中查找并加载具有指定名称的类。 |
URL | findResource(String name) | 在 URL 搜索路径上查找具有指定名称的资源。 |
EnumerationURL | findResources(String name) | 返回一个 URL 枚举,表示 URL 搜索路径上具有指定名称的所有资源。 |
protected PermissionCollection | getPermissions(CodeSource codesource) | 返回给定代码源对象的权限。 |
InputStream | getResourceAsStream(String name) | 返回用于读取指定资源的输入流。 |
URL[] | getURLs() | 返回用于加载类和资源的 URL 的搜索路径。 |
static URLClassLoader | newInstance(URL[] urls) | 为指定的 URL 和默认父类加载器创建 URLClassLoader 的新实例。 |
static URLClassLoader | newInstance(URL[] urls, ClassLoader parent) | 为指定的 URL 和父类加载器创建 URLClassLoader 的新实例。 |
从类 java.lang.ClassLoader 继承的方法 |
---|
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getPackage, getPackages, getParent, getResource, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, loadClass, registerAsParallelCapable, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
从类 java.security.SecureClassLoader 继承的方法 |
---|
defineClass, defineClass |
构造函数详细信息
URLClassLoader
public URLClassLoader(URL[] urls, ClassLoader parent)
为给定的 URL 构造一个新的 URLClassLoader。 在第一次在指定的父类加载器中搜索之后,将按照为类和资源指定的顺序搜索 URL。 假设任何以“/”结尾的 URL 都指向一个目录。 否则,假定 URL 指向将根据需要下载和打开的 JAR 文件。
如果有安全管理器,此方法首先调用安全管理器的 checkCreateClassLoader 方法,以确保允许创建类加载器。
参数:
参数名称 | 参数描述 |
---|---|
urls | 从中加载类和资源的 URL |
parent | 委托的父类加载器 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建类加载器。 |
NullPointerException | 如果网址为空。 |
URLClassLoader
public URLClassLoader(URL[] urls)
使用默认委托父 ClassLoader 为指定的 URL 构造一个新的 URLClassLoader。 在第一次在父类加载器中搜索之后,将按照为类和资源指定的顺序搜索 URL。 假设任何以“/”结尾的 URL 都指向一个目录。 否则,假定 URL 指向将根据需要下载和打开的 JAR 文件。
如果有安全管理器,此方法首先调用安全管理器的 checkCreateClassLoader 方法,以确保允许创建类加载器。
参数:
参数名称 | 参数描述 |
---|---|
urls | 从中加载类和资源的 URL |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建类加载器。 |
NullPointerException | 如果网址为空。 |
URLClassLoader
public URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
为指定的 URL、父类加载器和 URLStreamHandlerFactory 构造一个新的 URLClassLoader。 parent 参数将用作委托的父类加载器。 factory 参数将用作流处理程序工厂,以在创建新的 jar URL 时获取协议处理程序。
如果有安全管理器,此方法首先调用安全管理器的 checkCreateClassLoader 方法,以确保允许创建类加载器。
参数:
参数名称 | 参数描述 |
---|---|
urls | 从中加载类和资源的 URL |
parent | 委托的父类加载器 |
factory | 创建 URL 时使用的 URLStreamHandlerFactory |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkCreateClassLoader 方法不允许创建类加载器。 |
NullPointerException | 如果网址为空。 |
方法详情
getResourceAsStream
public InputStream getResourceAsStream(String name)
返回用于读取指定资源的输入流。 如果这个加载器被关闭,那么通过这个方法打开的任何资源都将被关闭。
ClassLoader.getResource(java.lang.String) 的文档中描述了搜索顺序。
覆盖:
类 ClassLoader 中的 getResourceAsStream
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
用于读取资源的输入流,如果找不到资源,则返回 null
close
public void close() throws IOException
关闭此 URLClassLoader,使其不能再用于加载此加载器定义的新类或资源。 由委托层次结构中的任何此加载器的父级定义的类和资源仍然可以访问。 此外,任何已加载的类或资源仍然可以访问。
对于 jar: 和 file: URL,它还会关闭它打开的所有文件。 如果调用 close 方法时另一个线程正在加载一个类,则该加载的结果是未定义的。
该方法通过在内部捕获 IOExceptions 尽最大努力尝试关闭所有打开的文件。 未经检查的异常和错误不会被捕获。 在已经关闭的加载程序上调用 close 无效。
指定者:
在接口 AutoCloseable 中关闭
指定者:
在接口Closeable中关闭
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果关闭此类加载器打开的任何文件导致 IOException。 任何此类异常都会在内部捕获。 如果只有一个被抓住,那么它会被重新抛出。 如果捕获了多个异常,则将第二个和随后的异常添加为捕获的第一个异常的抑制异常,然后重新抛出该异常。 |
SecurityException | 如果设置了安全管理器,并且它拒绝 RuntimePermission(“closeClassLoader”) |
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 都会根据需要加载和打开,直到找到该类。
覆盖:
类 ClassLoader 中的 findClass
参数:
参数名称 | 参数描述 |
---|---|
name | 班级名称 |
返回:
结果类
Throws:
Throw名称 | Throw描述 |
---|---|
ClassNotFoundException | 如果找不到类,或者加载器已关闭。 |
NullPointerException | 如果名称为空。 |
definePackage
protected Package definePackage(String name, Manifest man, URL url) throws IllegalArgumentException
在此 ClassLoader 中按名称定义新包。 指定 Manifest 中包含的属性将用于获取包版本和封装信息。 对于密封包,附加 URL 指定从中加载包的代码源 URL。
参数:
参数名称 | 参数描述 |
---|---|
name | 包名 |
man | 包含包版本和密封信息的清单 |
url | 包的代码源 url,如果没有,则为 null |
返回:
新定义的 Package 对象
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果包名称与此类加载器或其祖先之一中的现有包重复 |
findResource
public URL findResource(String name)
在 URL 搜索路径上查找具有指定名称的资源。
覆盖:
类 ClassLoader 中的 findResource
参数:
参数名称 | 参数描述 |
---|---|
name | 资源的名称 |
返回:
资源的 URL,如果找不到资源,或者加载器已关闭,则返回 null。
findResources
public EnumerationURL findResources(String name) throws IOException
返回一个 URL 枚举,表示 URL 搜索路径上具有指定名称的所有资源。
覆盖:
类 ClassLoader 中的 findResources
参数:
参数名称 | 参数描述 |
---|---|
name | 资源名称 |
返回:
URL 的枚举 如果加载程序关闭,则枚举将为空。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 异常 |
getPermissions
protected PermissionCollection getPermissions(CodeSource codesource)
返回给定代码源对象的权限。 该方法的实现首先调用super.getPermissions,然后根据codesource的URL添加权限。
如果此 URL 的协议是“jar”,则授予的权限基于 Jar 文件的 URL 所需的权限。
如果协议是“文件”并且存在权限组件,则可以授予连接到该权限并接受来自该权限的连接的权限。 如果协议是“文件”并且路径指定了文件,则授予读取该文件的权限。 如果协议是“文件”并且路径是目录,则授予读取所有文件和(递归)该目录中包含的所有文件和子目录的权限。
如果协议不是“文件”,则授予连接和接受来自 URL 主机的连接的权限。
覆盖:
类 SecureClassLoader 中的 getPermissions
参数:
参数名称 | 参数描述 |
---|---|
codesource | the codesource |
返回:
授予代码源的权限
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果代码源为空。 |
newInstance
public static URLClassLoader newInstance(URL[] urls, ClassLoader parent)
为指定的 URL 和父类加载器创建 URLClassLoader 的新实例。 如果安装了安全管理器,该方法返回的 URLClassLoader 的 loadClass 方法会在加载类之前调用 SecurityManager.checkPackageAccess 方法。
参数:
参数名称 | 参数描述 |
---|---|
urls | 用于搜索类和资源的 URL |
parent | 委托的父类加载器 |
返回:
生成的类加载器
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果网址为空。 |
newInstance
public static URLClassLoader newInstance(URL[] urls)
为指定的 URL 和默认父类加载器创建 URLClassLoader 的新实例。 如果安装了安全管理器,则此方法返回的 URLClassLoader 的 loadClass 方法将在加载类之前调用 SecurityManager.checkPackageAccess。
参数:
参数名称 | 参数描述 |
---|---|
urls | 用于搜索类和资源的 URL |
返回:
生成的类加载器
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果网址为空。 |