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对象。
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的更多相关文章
- java 基础知识学习 JVM虚拟机参数配置
1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...
- JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- 学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
随机推荐
- bash 截取字符串
转载自http://blog.chinaunix.net/uid-1757778-id-3162034.html 命令的2种替换形式 $()和 ``示例:截断字符串 a): #截取文件名称 ...
- c++ DISALLOW_COPY_AND_ASSIGN
Google C++编程规范 – 第三十二条 -<拷贝构造函数> [规范] 仅在确认需要的时候,才定义拷贝构造函数和赋值运算符:否则,请使用DISALLOW_COPY_AND_ASSIGN ...
- UIBarButtonItem变弹簧
UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystem ...
- Swift实战-豆瓣电台(六)视图跳转,传参及回跳
youku观看地址:http://v.youku.com/v_show/id_XNzMxMzQ3MDcy.html 要点 在ChannelController里面声明一个代理 这个代理遵循我们自定义的 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [转]Java中的多线程你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- JavaOOP QuickHit项目分析
项目需求:游戏等级6级,随机字符串每级长度不同.每升一级减少比较次数,但是字符串长度相应增加!每级总分数不同,如果游戏中途输入错误则游戏退出!玩家每次在规定时间内输入字符串的同时,打印出游戏难度等级. ...
- springday05-go1
新建web工程spring-netcross1.导入spring文件夹里的七个jar包,另外还要导入jdbc-lib的四个jar包,ojdbc.jar,commoms-pool,commons-dbc ...
- shp图层创建
IField,IFieldEdit,IFields,IFieldsEdit,IGeometryDef,IGeometryDefEdit接口 (2013-05-06 20:40:27) 转载▼ 标签: ...
- -XX:+printGC
-XX:+printGC 可以打印GC的简要信息[GC 4790K->374K(15872K), 0.0001606 secs][GC 4790K->374K(15872K), 0.000 ...