下图来自:http://blog.csdn.net/jiangwei0910410003/article/details/17733153

package com.test.jvm.common;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; /**
* 自定义的类加载器
*/
public class MyClassLoader extends ClassLoader {
private String name; //加载器的名字
// private String className; //被加载类的全名
private String path = "D:/workspace/eclipse-workspace64bit17-forPersonalProject/openbank-parent/openbank-test/src/test/java/"; //加载类的路径
private final String fileType = ".class"; //class文件的扩展名 public MyClassLoader(String name) {
super(); //让系统类加载器成为该类加载器的父类
this.name = name;
}
public MyClassLoader(ClassLoader parent,String name) {
super(parent); //显示指定该类加载器的的父加载器
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.name;
} // TODO Auto-generated method stub
private byte[] loadClassData(String className) {
InputStream inputStream = null;
byte[] data = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
className = className.replace('.', '/');
inputStream = new FileInputStream(new File(path+className+fileType));
byteArrayOutputStream = new ByteArrayOutputStream();
int ch = 0;
while(-1 != (ch = inputStream.read())) {
byteArrayOutputStream.write(ch);
}
data = byteArrayOutputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
byteArrayOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return data;
}
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
byte[] data =this.loadClassData(className);
//将字节数组转换成Class对象
return this.defineClass(className, data, 0, data.length);
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
System.out.println(System.getProperty("java.class.path"));
System.out.println("------------------");
MyClassLoader loader1 = new MyClassLoader("loader1");
// loader1.setPath("D:/temp/serverlib");
MyClassLoader loader2 = new MyClassLoader(loader1,"loader2"); //将loader1作为loader2的父加载器
// loader2.setPath("D:/temp/clientlib");
MyClassLoader loader3 = new MyClassLoader(null,"loader3"); //将第一个参数设为空表示父加载器为根加载器
// loader3.setPath("d:/temp/systemlib");
test(loader2);
System.out.println("-----------------");
test(loader3);
}
public static void test(ClassLoader loader) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class clazz = loader.loadClass("com.test.jvm.common.Sample");
Object object = clazz.newInstance();
}
}
public class Sample {
public int v1 = 1;
public Sample() {
System.out.println("Sample is loaded by: "+this.getClass().getClassLoader());
new Dog();
}
}
public class Dog {
public Dog() {
System.out.println("Dog is loaded by: "+this.getClass().getClassLoader());
}
}

我将编译后的Sample.class和Dog.class放在他们源代码所在的包里

运行结果:

D:\workspace\eclipse-workspace64bit17-forPersonalProject\openbank-parent\openbank-test\target\test-classes;D:\workspace\eclipse-workspace64bit17-forPersonalProject\openbank-parent\openbank-test\target\classes;D:\IDE\eclipse\plugins\org.testng.eclipse_6.9.13.201609291640\lib\testng.jar;D:\IDE\eclipse\plugins\org.testng.eclipse_6.9.13.201609291640\lib\jcommander.jar;D:\IDE\eclipse\plugins\org.testng.eclipse_6.9.13.201609291640\lib\bsh-2.0b4.jar;D:\IDE\eclipse\plugins\org.testng.eclipse_6.9.13.201609291640\lib\snakeyaml.jar;D:\workspace\eclipse-workspace64bit17-forPersonalProject\openbank-parent\openbank-batch\target\classes;C:\Users\Ash\.m2\repository\org\springframework\batch\spring-batch-core\3.0.6.RELEASE\spring-batch-core-3.0.6.RELEASE.jar;C:\Users\Ash\.m2\repository\com\ibm\jbatch\com.ibm.jbatch-tck-spi\1.0\com.ibm.jbatch-tck-spi-1.0.jar;C:\Users\Ash\.m2\repository\javax\batch\javax.batch-api\1.0\javax.batch-api-1.0.jar;C:\Users\Ash\.m2\repository\com\thoughtworks\xstream\xstream\1.4.7\xstream-1.4.7.jar;C:\Users\Ash\.m2\repository\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;C:\Users\Ash\.m2\repository\xpp3\xpp3_min\1.1.4c\xpp3_min-1.1.4c.jar;C:\Users\Ash\.m2\repository\org\codehaus\jettison\jettison\1.2\jettison-1.2.jar;C:\Users\Ash\.m2\repository\org\springframework\batch\spring-batch-infrastructure\3.0.6.RELEASE\spring-batch-infrastructure-3.0.6.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\retry\spring-retry\1.1.0.RELEASE\spring-retry-1.1.0.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-beans\4.1.9.RELEASE\spring-beans-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-context\4.1.9.RELEASE\spring-context-4.1.9.RELEASE.jar;D:\workspace\eclipse-workspace64bit17-forPersonalProject\openbank-parent\openbank-base\target\classes;C:\Users\Ash\.m2\repository\commons-dbcp\commons-dbcp\1.4\commons-dbcp-1.4.jar;C:\Users\Ash\.m2\repository\commons-pool\commons-pool\1.6\commons-pool-1.6.jar;C:\Users\Ash\.m2\repository\com\oracle\ojdbc6\11.2.0.4\ojdbc6-11.2.0.4.jar;C:\Users\Ash\.m2\repository\junit\junit\3.8.1\junit-3.8.1.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.2.8.RELEASE\spring-boot-starter-web-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter\1.2.8.RELEASE\spring-boot-starter-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot\1.2.8.RELEASE\spring-boot-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.2.8.RELEASE\spring-boot-autoconfigure-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.2.8.RELEASE\spring-boot-starter-logging-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\slf4j\jul-to-slf4j\1.7.13\jul-to-slf4j-1.7.13.jar;C:\Users\Ash\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.13\log4j-over-slf4j-1.7.13.jar;C:\Users\Ash\.m2\repository\ch\qos\logback\logback-classic\1.1.3\logback-classic-1.1.3.jar;C:\Users\Ash\.m2\repository\ch\qos\logback\logback-core\1.1.3\logback-core-1.1.3.jar;C:\Users\Ash\.m2\repository\org\yaml\snakeyaml\1.14\snakeyaml-1.14.jar;C:\Users\Ash\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.4.6\jackson-databind-2.4.6.jar;C:\Users\Ash\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.4.6\jackson-annotations-2.4.6.jar;C:\Users\Ash\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.4.6\jackson-core-2.4.6.jar;C:\Users\Ash\.m2\repository\org\hibernate\hibernate-validator\5.1.3.Final\hibernate-validator-5.1.3.Final.jar;C:\Users\Ash\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\Ash\.m2\repository\org\jboss\logging\jboss-logging\3.1.3.GA\jboss-logging-3.1.3.GA.jar;C:\Users\Ash\.m2\repository\com\fasterxml\classmate\1.0.0\classmate-1.0.0.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-core\4.1.9.RELEASE\spring-core-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-web\4.1.9.RELEASE\spring-web-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-webmvc\4.1.9.RELEASE\spring-webmvc-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-expression\4.1.9.RELEASE\spring-expression-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter-batch\1.2.8.RELEASE\spring-boot-starter-batch-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\hsqldb\hsqldb\2.3.3\hsqldb-2.3.3.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-jdbc\4.1.9.RELEASE\spring-jdbc-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter-jetty\1.2.8.RELEASE\spring-boot-starter-jetty-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-jsp\9.2.14.v20151106\jetty-jsp-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\toolchain\jetty-schemas\3.1.M0\jetty-schemas-3.1.M0.jar;C:\Users\Ash\.m2\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;C:\Users\Ash\.m2\repository\javax\servlet\jsp\javax.servlet.jsp-api\2.3.1\javax.servlet.jsp-api-2.3.1.jar;C:\Users\Ash\.m2\repository\org\glassfish\web\javax.servlet.jsp\2.3.2\javax.servlet.jsp-2.3.2.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\orbit\javax.servlet.jsp.jstl\1.2.0.v201105211821\javax.servlet.jsp.jstl-1.2.0.v201105211821.jar;C:\Users\Ash\.m2\repository\org\glassfish\web\javax.servlet.jsp.jstl\1.2.2\javax.servlet.jsp.jstl-1.2.2.jar;C:\Users\Ash\.m2\repository\org\glassfish\javax.el\3.0.0\javax.el-3.0.0.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\orbit\org.eclipse.jdt.core\3.8.2.v20130121\org.eclipse.jdt.core-3.8.2.v20130121.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-webapp\9.2.14.v20151106\jetty-webapp-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-xml\9.2.14.v20151106\jetty-xml-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-util\9.2.14.v20151106\jetty-util-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-servlet\9.2.14.v20151106\jetty-servlet-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-security\9.2.14.v20151106\jetty-security-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-server\9.2.14.v20151106\jetty-server-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\websocket-server\9.2.14.v20151106\websocket-server-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\websocket-common\9.2.14.v20151106\websocket-common-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\websocket-api\9.2.14.v20151106\websocket-api-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-io\9.2.14.v20151106\jetty-io-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\websocket-client\9.2.14.v20151106\websocket-client-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\websocket-servlet\9.2.14.v20151106\websocket-servlet-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-http\9.2.14.v20151106\jetty-http-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\javax-websocket-server-impl\9.2.14.v20151106\javax-websocket-server-impl-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-annotations\9.2.14.v20151106\jetty-annotations-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-plus\9.2.14.v20151106\jetty-plus-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\jetty-jndi\9.2.14.v20151106\jetty-jndi-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\javax\annotation\javax.annotation-api\1.2\javax.annotation-api-1.2.jar;C:\Users\Ash\.m2\repository\org\ow2\asm\asm\5.0.1\asm-5.0.1.jar;C:\Users\Ash\.m2\repository\org\ow2\asm\asm-commons\5.0.1\asm-commons-5.0.1.jar;C:\Users\Ash\.m2\repository\org\ow2\asm\asm-tree\5.0.1\asm-tree-5.0.1.jar;C:\Users\Ash\.m2\repository\org\eclipse\jetty\websocket\javax-websocket-client-impl\9.2.14.v20151106\javax-websocket-client-impl-9.2.14.v20151106.jar;C:\Users\Ash\.m2\repository\javax\websocket\javax.websocket-api\1.0\javax.websocket-api-1.0.jar;C:\Users\Ash\.m2\repository\org\springframework\data\spring-data-redis\1.7.0.RELEASE\spring-data-redis-1.7.0.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\data\spring-data-keyvalue\1.1.0.RELEASE\spring-data-keyvalue-1.1.0.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\data\spring-data-commons\1.9.4.RELEASE\spring-data-commons-1.9.4.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-tx\4.1.9.RELEASE\spring-tx-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-oxm\4.1.9.RELEASE\spring-oxm-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-aop\4.1.9.RELEASE\spring-aop-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-context-support\4.1.9.RELEASE\spring-context-support-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\slf4j\slf4j-api\1.7.19\slf4j-api-1.7.19.jar;C:\Users\Ash\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.13\jcl-over-slf4j-1.7.13.jar;C:\Users\Ash\.m2\repository\redis\clients\jedis\2.8.0\jedis-2.8.0.jar;C:\Users\Ash\.m2\repository\org\apache\commons\commons-pool2\2.2\commons-pool2-2.2.jar;C:\Users\Ash\.m2\repository\org\springframework\boot\spring-boot-starter-test\1.2.8.RELEASE\spring-boot-starter-test-1.2.8.RELEASE.jar;C:\Users\Ash\.m2\repository\org\mockito\mockito-core\1.10.19\mockito-core-1.10.19.jar;C:\Users\Ash\.m2\repository\org\objenesis\objenesis\2.1\objenesis-2.1.jar;C:\Users\Ash\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Ash\.m2\repository\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;C:\Users\Ash\.m2\repository\org\springframework\spring-test\4.1.9.RELEASE\spring-test-4.1.9.RELEASE.jar;C:\Users\Ash\.m2\repository\org\testng\testng\6.9.10\testng-6.9.10.jar;C:\Users\Ash\.m2\repository\com\beust\jcommander\1.48\jcommander-1.48.jar;C:\Users\Ash\.m2\repository\org\beanshell\bsh\2.0b4\bsh-2.0b4.jar
------------------
Sample is loaded by: sun.misc.Launcher$AppClassLoader@2d8eef25
Dog is loaded by: sun.misc.Launcher$AppClassLoader@2d8eef25
-----------------
Sample is loaded by: loader3
Dog is loaded by: loader3

如果我将Sample.class和Dog.class放在非System.getProperty("java.class.path")路径下,则AppClassLoader将无法找到这个类,则加载这个类的任务将落在自定义类加载器身上,那么上面的输出结果将会不同

JVM启动过程 类加载器的更多相关文章

  1. JVM学习笔记——类加载器与类加载过程

    类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...

  2. JVM启动过程

    JVM启动过程包括:加载.连接.初始化 1.加载:就是将class文件加载到内存.详细的说是,将class文件加载到运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封 ...

  3. JVM的艺术—类加载器篇(二)

    分享是价值的传递,喜欢就点个赞 引言 今天我们继续来深入的剖析类加载器的内容.上节课我们讲了类加载器的基本内容,没看过的小伙伴请加关注.今天我们继续. 什么是定义类加载器和初始化类加载器? 定义类加载 ...

  4. JVM的艺术—类加载器篇(三)

    JVM的艺术-类加载器篇(三) 引言 今天我们继续来深入的剖析类加载器的内容.上篇文章我们讲解了类加载器的双亲委托模型.全盘委托机制.以及类加载器双亲委托模型的优点.缺点等内容,没看过的小伙伴请加关注 ...

  5. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  6. 038.[转] JVM启动过程与类加载

    From: https://blog.csdn.net/luanlouis/article/details/40043991 Step 1.根据JVM内存配置要求,为JVM申请特定大小的内存空间 ? ...

  7. JVM学习--(六)类加载器原理

    我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的 ...

  8. JVM学习记录-类加载器

    前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...

  9. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

随机推荐

  1. jdk1.6 反射性能对比【原】

    ReflectPerformance.java package aaa.bbb.ccc; import java.lang.reflect.Method; public class ReflectPe ...

  2. 开始学习tensorflow

    搭建神经网络: 准备数据 定义数据输入层 定义网络隐藏层和预测层 定义loss 表达式 选择optimizer使得loss 最小 import tensorflow as tf import nump ...

  3. sql 把多列内容合并

    这个语句不完整.应该是这样:stuff(select ',' + fieldname  from tablename for xml path('')),1,1,'') as ’别名‘这一整句的作用是 ...

  4. MySQL - 日常操作一 增删改查

    mysql 源码安装 创建 mysql  账户 组 groupadd mysql useradd mysql -g mysql -M -s /bin/false 解压缩源码安装 .tar.gz cd ...

  5. Linux - 系统资源

    查看剩余内存 free -m #-/+ buffers/cache: #6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器) #linux会利用所有的剩余内存作为缓存,所以要保 ...

  6. NOIP2018TG题解

    应该不会被禁赛吧qwq Day1 T1 铺设道路 €€£:我 抄 我 自 己 我考场上写的是一个类似于差分的做法,就是开个数组表示某个位置是否贡献答案,从小到大枚举高度,那么一个位置能贡献答案当且仅当 ...

  7. luogu P4342 [IOI1998]Polygon

    IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...

  8. 阿里云3台机器组成集群配置ssh免密码登陆

    1 查询阿里云局网ip 注意:需要配置同一地区同一可用区的机器 才是一个局网 2 配置好hosts文件 3 hostname确认也是正确的 4 生成公钥私钥 三台机器同样操作 ssh-keygen - ...

  9. [转]Linux/Windows下脚本对拍程序

    [新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...

  10. Kali2.0更新

    下载链接:猛戳这里 更新以后速度与界面友好性提高了! 界面仿造了ubuntu和fedora,应用也有很多小图标!这个对个人来说比较赞 安装以后的几件事 1.安装vmtools,方法跟1.0一样! ta ...