urlclassloader.java_JAVA基础知识之JVM-——URLClassLoader

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对象。

1 packagejvmTest;2

3 importjava.net.URL;4 importjava.net.URLClassLoader;5 importjava.sql.Connection;6 importjava.sql.Driver;7 importjava.util.Properties;8

9 public classURLClassLoaderTest {10 private staticConnection conn;11

12 public static Connection getConn(String url, String user, String pass) throwsException {13 if (conn == null) {14 //创建URL数组

15 URL[] urls = {new URL("file:mysql-connector-java-5.1.12-bin.jar")};16 //以默认的ClassLoader作为父类的ClassLoader, 创建URLClassLoader

17 URLClassLoader myClassLoader = newURLClassLoader(urls);18 System.out.println("默认父类加载器: " +myClassLoader.getParent());19 System.out.println("默认父类加载器路径: " + myClassLoader.getParent().getResource(""));20 System.out.println("当前的类加载器路径: " + myClassLoader.getResource(""));21

22 //加载 mysql-connector-java-5.1.12-bin.jar包里面的\com\mysql\jdbc\Driver.class 驱动,并创建实例23 //加载路径 myClassLoader.getResource("")

24 Driver driver = (Driver)myClassLoader.loadClass("com.mysql.jdbc.Driver").newInstance();25 //创建一个设置jdbc连接属性的Properties对象

26 Properties props = newProperties();27 props.setProperty("user", user);28 props.setProperty("password", pass);29 //调用driver的connection来取得连接

30 conn =driver.connect(url, props);31 }32 returnconn;33 }34

35

36

37 public static void main(String[] args) throwsException {38 System.out.println("user.dir: " + System.getProperty("user.dir"));39 System.out.println(getConn("jdbc:mysql://localhost:3306/mysql", "root", ""));40 }41 }

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

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

1 user.dir: C:\Users\IBM_ADMIN\PROJECT\CrazyJAVA\PROJECT_JavaBasic2 默认父类加载器: sun.misc.Launcher$AppClassLoader@556e8bda3 默认父类加载器路径: file:/C:/Users/IBM_ADMIN/PROJECT/CrazyJAVA/PROJECT_JavaBasic/bin/

4 当前的类加载器路径: 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窗口中执行这个程序,却能正常执行,

fb148565c22ffc58cfbd19d679576a14.png

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值