URLClassLoader是ClassLoader的一个实现类,它既能从本地加载二进制文件类,也可以从远程加载类。

它有两个构造函数, 即

URLClassLoader(URL[] urls),使用默认的父类加载器(SystemClassLoader)创建一个ClassLoader对象

URLClassLoader(URL[] urls, ClassLoader parent),使用指定的类加载器作为父类加载器创建ClassLoader对象

上面两个构造函数都有一个URL参数,这里的URL参数值可以是file:前缀,http:前缀,也可以是ftp:前缀,功能非常强大。

下面的例子中,我将用URLClassLoader加载mysql的驱动包,通过loadClass加载指定的类,进而通过newInstance创建该类默认实例,得到com.mysql.jdbc.Driver对象。

 package jvmTest;

 import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.util.Properties; 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.12-bin.jar")};
//以默认的ClassLoader作为父类的ClassLoader, 创建URLClassLoader
URLClassLoader myClassLoader = new URLClassLoader(urls);
System.out.println("默认父类加载器: " + myClassLoader.getParent());
System.out.println("默认父类加载器路径: " + myClassLoader.getParent().getResource(""));
System.out.println("当前的类加载器路径: " + myClassLoader.getResource("")); //加载 mysql-connector-java-5.1.12-bin.jar包里面的\com\mysql\jdbc\Driver.class 驱动,并创建实例
//加载路径 myClassLoader.getResource("")
Driver driver = (Driver)myClassLoader.loadClass("com.mysql.jdbc.Driver").newInstance();
//创建一个设置jdbc连接属性的Properties对象
Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("password", pass);
//调用driver的connection来取得连接
conn = driver.connect(url, props);
}
return conn;
} public static void main(String[] args) throws Exception {
System.out.println("user.dir: " + System.getProperty("user.dir"));
System.out.println(getConn("jdbc:mysql://localhost:3306/mysql", "root", ""));
}
}

将mysql驱动包mysql-connector-java-5.1.12-bin.jar放在系统类加载器的路径下,即file:/C:/Users/IBM_ADMIN/PROJECT/CrazyJAVA/PROJECT_JavaBasic/bin/

容纳后在Eclipse中执行这个程序,会发现抛出错误,

 user.dir: C:\Users\IBM_ADMIN\PROJECT\CrazyJAVA\PROJECT_JavaBasic
默认父类加载器: sun.misc.Launcher$AppClassLoader@556e8bda
默认父类加载器路径: file:/C:/Users/IBM_ADMIN/PROJECT/CrazyJAVA/PROJECT_JavaBasic/bin/
当前的类加载器路径: file:/C:/Users/IBM_ADMIN/PROJECT/CrazyJAVA/PROJECT_JavaBasic/bin/
5 Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
6 at java.net.URLClassLoader.findClass(URLClassLoader.java:600)
7 at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:777)
8 at java.lang.ClassLoader.loadClass(ClassLoader.java:750)
9 at java.lang.ClassLoader.loadClass(ClassLoader.java:731)
10 at jvmTest.URLClassLoaderTest.getConn(URLClassLoaderTest.java:24)
11 at jvmTest.URLClassLoaderTest.main(URLClassLoaderTest.java:39)

报ClassNotFoundException,感觉很奇怪,明明驱动包就在加载路径下面。。。

于是再在cmd窗口中执行这个程序,却能正常执行,

对于这个问题,自己研究了下,也百度了一下,初步认定是Eclipse执行java程序的时候,会使用Eclipse的classpath设置,而不是使用操作系统的classpath,

经过测试,Eclipse似乎是用的是工作目录(user.dir)作为classpath。

不过上面的错误并不是重点,重点是演示URLClassLoader的机制。

最新文章

  1. 浅谈Java的匿名类
  2. 附录E 安装Kafka
  3. CEPH经常出现slow request的排查解决
  4. STL Map的使用
  5. c# 相对路径的一些资料
  6. linux crontab 文件位置和日志位置
  7. 谷歌联合 Adobe 发布 Noto 字体【免费下载】
  8. 使用NPOI操纵Excle,并输入到客户端
  9. Locally Weighted Regression
  10. java Scanner与BufferedReader读取键盘输入性能比较
  11. ABAP程序的效率(转)
  12. seajs的模块化开发--实践笔记
  13. 移动webapp的那些bug
  14. mysql 批量插入优化之rewriteBatchedStatements
  15. photoshop出现错误:要求96和8之间的整数。已插入最接近的数值
  16. 分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)
  17. 快速查看linux命令的用法----------TLDR
  18. redis 执行操作时提示(error) NOAUTH Authentication required.
  19. Navicat操作SQL server 2008R2文件.bak文件还原
  20. 《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」

热门文章

  1. layoutsubviews什么时候调用
  2. pg_stat_statements
  3. JAVA-环境部分
  4. http://codeforces.com/contest/555/problem/B
  5. ofbiz进击 。 ofbiz 退货流程(包含获取可退货项流程分析 以及 取消退货项的过程分析)
  6. URAL 1146 Maximum Sum(DP)
  7. paper 25 :SVM支持向量机是什么意思?
  8. 10.Java设计模式 工厂模式,单例模式
  9. Mysql索引总结(一)
  10. 锋利的JQuery(二)