URLClassLoader
Java 原生JDK里面为ClassLoader提供了一个URLClassLoader实现类,通过UML图我们可以看出,它是ExtClassLoader和 AppClassLoader的父类,它功能强大,它既可以从本地文件系统来获取二进制文件去加载,也可以从远程主机 获取二进制文件去加载。
该类加载器用于指向JAR文件和目录的URL 的搜索路径加载类和资源。这里假定任何以 / 结束的URL都是指向该目录的,如果不是以该字符结束的,则会认为指向一个根据需要打开的JAR文件
构造方法摘要 |
---|
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 列表中,以便搜索类和资源。 |
protected Package definePackage(String name, Manifest man, URL url) 用该 ClassLoader 中的名称定义一个新包。 |
protected Class<?> findClass(String name) 通过 URL 搜索路径查找并加载具有指定名称的类。 |
URL findResource(String name) 在 URL 搜索路径中查找具有指定名称的资源。 |
Enumeration<URL> findResources(String name) 返回表示 URL 搜索路径中具有指定名称的所有资源的 URL 枚举。 |
protected PermissionCollection getPermissions(CodeSource codesource) 返回给定 codesource 对象的权限。 |
URL[] getURLs() 返回用于加载类和资源的 URL 搜索路径。 |
static URLClassLoader newInstance(URL[] urls) 为 指定的 URL 和默认的父类加载器创建新 URLClassLoader 实例。 |
static URLClassLoader newInstance(URL[] urls, ClassLoader parent) 为指定的 URL 和父类加载器创建新 URLClassLoader 实例。 |
从类 java.security.SecureClassLoader 继承的方法 |
---|
defineClass, defineClass |
构造方法详细信息
URLClassLoader public URLClassLoader(URL[] urls, ClassLoader parent)
为给定的 URL 构造新 URLClassLoader。首先在指定的父类加载器中搜索 URL,然后按照为类和资源指定的顺序搜索 URL。这里假定任何以 / 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要下载和打开的 JAR 文件。
如果有安全管理器,该方法首先调用安全管理器的 checkCreateClassLoader 方法以确保允许创建类加载器。
参数:
urls - 从其位置加载类和资源的 UR
parent - 用于委托的父类加载器
抛出:
SecurityException - 如果存在安全管理器,且其 checkCreateClassLoader 方法不允许创建类加载器。
另请参见:
SecurityManager.checkCreateClassLoader()
public URLClassLoader(URL[] urls)
使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。首先在父类加载器中搜索 URL,然后按照为类和资源指定的顺序搜索 URL。这里假定任何以 / 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要下载和打开的 JAR 文件。
如果有安全管理器,该方法首先调用安全管理器的 checkCreateClassLoader 方法以确保允许创建类加载器。
参数:
urls - 从其位置加载类和资源的 URL
抛出:
SecurityException - 如果安全管理器存在并且其 checkCreateClassLoader 方法不允许创建类加载器。
另请参见:
SecurityManager.checkCreateClassLoader()
public URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
为指定的 URL、父类加载器和 URLStreamHandlerFactory 创建新 URLClassLoader。该父参数将充当委托的父类加载器。该工厂参数将充当创建新 jar URL 时获取协议处理程序的流处理程序工厂。
如果有安全管理器,该方法首先调用安全管理器的 checkCreateClassLoader 方法以确保允许创建类加载器。
参数:
urls - 从其位置加载类和资源的 URL
parent - 用于委托的父类加载器
factory - 创建 URL 时使用的 URLStreamHandlerFactory
抛出:
SecurityException - 如果安全管理器存在并且其 checkCreateClassLoader 方法不允许创建类加载器。
另请参见:
SecurityManager.checkCreateClassLoader()
方法详细信息
addURL
protected void addURL(URL url)
将指定的 URL 添加到 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 - 类的名称
返回:
结果类
抛出:
ClassNotFoundException - 如果无法找到该类
definePackage
protected Package definePackage(String name, Manifest man, URL url)
throws IllegalArgumentException
用该 ClassLoader 中的名称定义一个新包。该指定的 Manifest 中包含的属性将用于包含包版本和密封信息。对于密封的包,此附加 URL 从加载该包的 URL 指定代码源 URL。
参数:
name - 包的名称
man - 包含包的版本和密封信息的 Manifest
url - 包的代码源 url,或者如果没有,则为 null
返回:
新定义的 Package 对象
抛出:
IllegalArgumentException - 如果包的名称与该类加载器或其祖先之一中现有的包重名
findResource
public URL findResource(String name)
在 URL 搜索路径中查找具有指定名称的资源。
覆盖:
类 ClassLoader 中的 findResource
参数:
name - 资源的名称
返回:
资源的 URL,或者如果无法找到该资源,则返回 null。
findResources
public Enumeration<URL> findResources(String name)
throws IOException
返回表示 URL 搜索路径中具有指定名称的所有资源的 URL 枚举。
覆盖:
类 ClassLoader 中的 findResources
参数:
name - 资源名称
返回:
URL 的枚举
抛出:
IOException - 如果发生 I/O 异常
getPermissions
protected PermissionCollection getPermissions(CodeSource codesource)
返回给定 codesource 对象的权限。该方法的实现首先调用 super.getPermissions,然后基于 codesource 的 URL 添加权限。
如果此 URL 的协议为 "jar",那么授予的权限将基于 Jar 文件 URL 所请求的权限。
如果协议为 "file",并且路径指定了某个文件,则要授予对该文件的读权限。如果协议为 "file",并且路径是一个目录,则要授予该目录中的所有文件及其(递归)子目录中包含的所有文件读权限。
如果协议不是 "file",则允许连接到和接收来自 URL 主机的连接。
覆盖:
类 SecureClassLoader 中的 getPermissions
参数:
codesource - codesource
返回:
授予 codesource 的权限
newInstance
public static URLClassLoader newInstance(URL[] urls, ClassLoader parent)
为指定的 URL 和父类加载器创建新 URLClassLoader 实例。如果安装了安全管理器,该方法返回的 URLClassLoader 的 loadClass 方法将在加载该类之前调用 SecurityManager.checkPackageAccess 方法。
参数:
urls - 用于搜索类和资源的 URL
parent - 用于委托的父类加载器
返回:
结果类加载器
newInstance
public static URLClassLoader newInstance(URL[] urls)
为指定的 URL 和默认的父类加载器创建新 URLClassLoader 实例。如果安装了安全管理器,该方法返回的 URLClassLoader 的 loadClass 方法将在加载该类之前调用 SecurityManager.checkPackageAccess。
参数:
urls - 用于搜索类和资源的 URL
返回:
结果类加载器