18.2.3 URLCLassLoader类

18.2.4 URLCLassLoader类

JavaClassLoader提供了一个URLClassloader实现类,URLClassloader类是系统类加载器和扩展类加载器的父类(此处的父类,就是指类与类之间的继承关系)。 URLClassloader功能比较强大,它既可以从本地文件系统获取二进制文件来加载类,也可以从远程主机获取二进制文件来加载类
在应用程序中可以直接使用URLClassLoader加载类, URLClassLoader类提供了如下两个构造器。

构造方法 描述
URLClassLoader(URL[] urls) 使用默认的父类加载器创建一个ClassLoader对象,该对象将从urls所指定的系列路径来查询并加载类。
URLClassLoader(URL[] urls, ClassLoader parent) 使用指定的父类加载器创建一个ClassLoader对象,其他功能与前一个构造器相同

一旦得到了URLClassLoader对象之后,就可以调用该对象的loadClass()方法来加载指定类。

下面程序示范了如何直接从文件系统中加载MySQL驱动,并使用该驱动来获取数据库连接。通过这种方式来获取数据库连接,可以无须将MySQL驱动添加到CLASSPATH环境变量中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.sql.*;
import java.util.*;
import java.net.*;

public class URLClassLoaderTest
{
private static Connection conn;
// 定义一个获取数据库连接方法
public static Connection getConn(String url ,
String user , String pass) throws Exception
{
if (conn == null)
{
// 创建一个URL数组
URL[] urls = {new URL(
"file:mysql-connector-java-5.1.30-bin.jar")};
// 以默认的ClassLoader作为父ClassLoader,创建URLClassLoader
URLClassLoader myClassLoader = new URLClassLoader(urls);
// 加载MySQL的JDBC驱动,并创建默认实例
Driver driver = (Driver)myClassLoader.
loadClass("com.mysql.jdbc.Driver").newInstance();
// 创建一个设置JDBC连接属性的Properties对象
Properties props = new Properties();
// 至少需要为该对象传入user和password两个属性
props.setProperty("user" , user);
props.setProperty("password" , pass);
// 调用Driver对象的connect方法来取得数据库连接
conn = driver.connect(url , props);
}
return conn;
}
public static void main(String[] args)throws Exception
{
System.out.println(getConn("jdbc:mysql://localhost:3306/mysql"
, "root" , "root"));
}
}

上面程序中的前两行粗体字代码创建了一个URLClassloader对象,该对象使用默认的父类加载器该类加载器的类加载路径是当前路径下的mysql-connector-java-5.1.30-bin.jar文件,将MySQL驱动复制到该路径下,这样保证该ClassLoader可以正常加载到com.mysql.jdbc Driver
程序的第三行粗体字代码使用ClassLoaderloadClass()方法加载指定类,并调用Class对象的newInstance()方法创建了一个该类的默认实例也就是得到com.mysql.jdbc.Driver类的对象,当然该对象的实现类实现了java.sql.Driver接口,所以程序将其强制类型转换为Driver.程序的最后一行粗体字代码通过Driver而不是DriverManager来获取数据库连接,关于Driver接口的用法读者可以自行查阅API文档。
正如前面所看到的,创建URLClassLoader时传入了一个URL数组参数,该ClassLoader就可以从这系列URL指定的资源中加载指定类,这里的URL:

  • 可以以file:为前缀,表明从本地文件系统加载;
  • 可以以http:为前缀,表明从互联网通过HTTP访问来加载;
  • 也可以以ftp:为前缀,表明从互联网通过FTP访问来加载;

本文重点

  • URLClassloader类是系统类加载器和扩展类加载器的父类
  • 在应用程序中可以直接使用URLClassLoader来加载类,URLClassLoader既可以从本地文件系统获取二进制文件来加载类,也可以从远程主机获取二进制文件来加载类.