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的机制。

JAVA基础知识之JVM-——URLClassLoader的更多相关文章

  1. java 基础知识学习 JVM虚拟机参数配置

    1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...

  2. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  3. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  4. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  5. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  6. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  7. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  8. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  9. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  10. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

随机推荐

  1. introcuding less css with less.js, using webcompiler ext

    1.html [watch out for the !js load sequence and the attribute of !rel stylesheet/less!] <!DOCTYPE ...

  2. SQL 存储和触发器

    存储过程:就像函数一样的会保存在数据库中-->可编程性 --> 存储过程 创建存储过程:create proc JiaFa--需要的参数@a int,@b intas --存储过程的内容 ...

  3. .NET: 配置文件

    VS里项目->添加新项->应用程序配置文件 <?xml version="1.0" encoding="utf-8" ?> <co ...

  4. ligerui+json_002_Grid用法、属性总结

    原文更全面,地址: http://blog.csdn.net/dxnn520/article/details/8216560 // ================================== ...

  5. react 绑定事件

    1.显示隐藏 2.输入框输入内容,立即显示出来 代码如下: 注意:版本 React v15.0.1 ReactDOM v15.0.1 browser.min.js是编译文件,将代码解析为浏览器识别的j ...

  6. JVM中启用逃逸分析

    -XX:+DoEscapeAnalysis 逃逸分析优化JVM原理我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量 ...

  7. 夺命雷公狗ThinkPHP项目之----企业网站15之文章删除的完成(单个)

    我们文章最后一步就到他的删除了,这个其实是最简单的一个,废话不多说,先来写控制器: public function del(){ $id = I('ar_id'); if(M('Article')-& ...

  8. 夺命雷公狗---DEDECMS----14dedecms首页导航条的完成

    我们的首页完成了,那么下一步就开始创建一个模型了, 添加好电影模型后我们来给他添加一些字段,这些字段主要还是要看我们的项目需求来添加的,因为我们的项目里有: 我们在项目中要用得上这些字段,所以要对他们 ...

  9. ajax中网页传输(二)JSON——下拉列表显示练习

    以json返回数据类型显示“民族下拉列表” 第一:body页面显示部分 <title>JSON下拉显示Nation表中的数据</title> <script src=&q ...

  10. linux添加字体的过程

    只说一下过程, 至于具体的原理还没搞明白. 1. 首先你要有字体文件,ttf或者ttc格式的均可以 我们可以从windows的 C:\WINDOWS\Fonts\ 这个目录下的字体文件复制出来,例如我 ...