下图来自: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:workspaceeclipse-workspace64bit17-forPersonalProjectopenbank-parentopenbank-test arget est-classes;D:workspaceeclipse-workspace64bit17-forPersonalProjectopenbank-parentopenbank-test argetclasses;D:IDEeclipsepluginsorg.testng.eclipse_6.9.13.201609291640lib estng.jar;D:IDEeclipsepluginsorg.testng.eclipse_6.9.13.201609291640libjcommander.jar;D:IDEeclipsepluginsorg.testng.eclipse_6.9.13.201609291640libsh-2.0b4.jar;D:IDEeclipsepluginsorg.testng.eclipse_6.9.13.201609291640libsnakeyaml.jar;D:workspaceeclipse-workspace64bit17-forPersonalProjectopenbank-parentopenbank-batch argetclasses;C:UsersAsh.m2 epositoryorgspringframeworkatchspring-batch-core3.0.6.RELEASEspring-batch-core-3.0.6.RELEASE.jar;C:UsersAsh.m2 epositorycomibmjbatchcom.ibm.jbatch-tck-spi1.0com.ibm.jbatch-tck-spi-1.0.jar;C:UsersAsh.m2 epositoryjavaxatchjavax.batch-api1.0javax.batch-api-1.0.jar;C:UsersAsh.m2 epositorycom houghtworksxstreamxstream1.4.7xstream-1.4.7.jar;C:UsersAsh.m2 epositoryxmlpullxmlpull1.1.3.1xmlpull-1.1.3.1.jar;C:UsersAsh.m2 epositoryxpp3xpp3_min1.1.4cxpp3_min-1.1.4c.jar;C:UsersAsh.m2 epositoryorgcodehausjettisonjettison1.2jettison-1.2.jar;C:UsersAsh.m2 epositoryorgspringframeworkatchspring-batch-infrastructure3.0.6.RELEASEspring-batch-infrastructure-3.0.6.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframework etryspring-retry1.1.0.RELEASEspring-retry-1.1.0.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-beans4.1.9.RELEASEspring-beans-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-context4.1.9.RELEASEspring-context-4.1.9.RELEASE.jar;D:workspaceeclipse-workspace64bit17-forPersonalProjectopenbank-parentopenbank-base argetclasses;C:UsersAsh.m2 epositorycommons-dbcpcommons-dbcp1.4commons-dbcp-1.4.jar;C:UsersAsh.m2 epositorycommons-poolcommons-pool1.6commons-pool-1.6.jar;C:UsersAsh.m2 epositorycomoracleojdbc611.2.0.4ojdbc6-11.2.0.4.jar;C:UsersAsh.m2 epositoryjunitjunit3.8.1junit-3.8.1.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter-web1.2.8.RELEASEspring-boot-starter-web-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter1.2.8.RELEASEspring-boot-starter-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot1.2.8.RELEASEspring-boot-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-autoconfigure1.2.8.RELEASEspring-boot-autoconfigure-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter-logging1.2.8.RELEASEspring-boot-starter-logging-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgslf4jjul-to-slf4j1.7.13jul-to-slf4j-1.7.13.jar;C:UsersAsh.m2 epositoryorgslf4jlog4j-over-slf4j1.7.13log4j-over-slf4j-1.7.13.jar;C:UsersAsh.m2 epositorychqoslogbacklogback-classic1.1.3logback-classic-1.1.3.jar;C:UsersAsh.m2 epositorychqoslogbacklogback-core1.1.3logback-core-1.1.3.jar;C:UsersAsh.m2 epositoryorgyamlsnakeyaml1.14snakeyaml-1.14.jar;C:UsersAsh.m2 epositorycomfasterxmljacksoncorejackson-databind2.4.6jackson-databind-2.4.6.jar;C:UsersAsh.m2 epositorycomfasterxmljacksoncorejackson-annotations2.4.6jackson-annotations-2.4.6.jar;C:UsersAsh.m2 epositorycomfasterxmljacksoncorejackson-core2.4.6jackson-core-2.4.6.jar;C:UsersAsh.m2 epositoryorghibernatehibernate-validator5.1.3.Finalhibernate-validator-5.1.3.Final.jar;C:UsersAsh.m2 epositoryjavaxvalidationvalidation-api1.1.0.Finalvalidation-api-1.1.0.Final.jar;C:UsersAsh.m2 epositoryorgjbossloggingjboss-logging3.1.3.GAjboss-logging-3.1.3.GA.jar;C:UsersAsh.m2 epositorycomfasterxmlclassmate1.0.0classmate-1.0.0.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-core4.1.9.RELEASEspring-core-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-web4.1.9.RELEASEspring-web-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-webmvc4.1.9.RELEASEspring-webmvc-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-expression4.1.9.RELEASEspring-expression-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter-batch1.2.8.RELEASEspring-boot-starter-batch-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorghsqldbhsqldb2.3.3hsqldb-2.3.3.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-jdbc4.1.9.RELEASEspring-jdbc-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter-jetty1.2.8.RELEASEspring-boot-starter-jetty-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-jsp9.2.14.v20151106jetty-jsp-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejetty oolchainjetty-schemas3.1.M0jetty-schemas-3.1.M0.jar;C:UsersAsh.m2 epositoryjavaxservletjavax.servlet-api3.1.0javax.servlet-api-3.1.0.jar;C:UsersAsh.m2 epositoryjavaxservletjspjavax.servlet.jsp-api2.3.1javax.servlet.jsp-api-2.3.1.jar;C:UsersAsh.m2 epositoryorgglassfishwebjavax.servlet.jsp2.3.2javax.servlet.jsp-2.3.2.jar;C:UsersAsh.m2 epositoryorgeclipsejettyorbitjavax.servlet.jsp.jstl1.2.0.v201105211821javax.servlet.jsp.jstl-1.2.0.v201105211821.jar;C:UsersAsh.m2 epositoryorgglassfishwebjavax.servlet.jsp.jstl1.2.2javax.servlet.jsp.jstl-1.2.2.jar;C:UsersAsh.m2 epositoryorgglassfishjavax.el3.0.0javax.el-3.0.0.jar;C:UsersAsh.m2 epositoryorgeclipsejettyorbitorg.eclipse.jdt.core3.8.2.v20130121org.eclipse.jdt.core-3.8.2.v20130121.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-webapp9.2.14.v20151106jetty-webapp-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-xml9.2.14.v20151106jetty-xml-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-util9.2.14.v20151106jetty-util-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-servlet9.2.14.v20151106jetty-servlet-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-security9.2.14.v20151106jetty-security-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-server9.2.14.v20151106jetty-server-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketwebsocket-server9.2.14.v20151106websocket-server-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketwebsocket-common9.2.14.v20151106websocket-common-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketwebsocket-api9.2.14.v20151106websocket-api-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-io9.2.14.v20151106jetty-io-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketwebsocket-client9.2.14.v20151106websocket-client-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketwebsocket-servlet9.2.14.v20151106websocket-servlet-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-http9.2.14.v20151106jetty-http-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketjavax-websocket-server-impl9.2.14.v20151106javax-websocket-server-impl-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-annotations9.2.14.v20151106jetty-annotations-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-plus9.2.14.v20151106jetty-plus-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryorgeclipsejettyjetty-jndi9.2.14.v20151106jetty-jndi-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryjavaxannotationjavax.annotation-api1.2javax.annotation-api-1.2.jar;C:UsersAsh.m2 epositoryorgow2asmasm5.0.1asm-5.0.1.jar;C:UsersAsh.m2 epositoryorgow2asmasm-commons5.0.1asm-commons-5.0.1.jar;C:UsersAsh.m2 epositoryorgow2asmasm-tree5.0.1asm-tree-5.0.1.jar;C:UsersAsh.m2 epositoryorgeclipsejettywebsocketjavax-websocket-client-impl9.2.14.v20151106javax-websocket-client-impl-9.2.14.v20151106.jar;C:UsersAsh.m2 epositoryjavaxwebsocketjavax.websocket-api1.0javax.websocket-api-1.0.jar;C:UsersAsh.m2 epositoryorgspringframeworkdataspring-data-redis1.7.0.RELEASEspring-data-redis-1.7.0.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkdataspring-data-keyvalue1.1.0.RELEASEspring-data-keyvalue-1.1.0.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkdataspring-data-commons1.9.4.RELEASEspring-data-commons-1.9.4.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-tx4.1.9.RELEASEspring-tx-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-oxm4.1.9.RELEASEspring-oxm-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-aop4.1.9.RELEASEspring-aop-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryaopallianceaopalliance1.0aopalliance-1.0.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-context-support4.1.9.RELEASEspring-context-support-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorgslf4jslf4j-api1.7.19slf4j-api-1.7.19.jar;C:UsersAsh.m2 epositoryorgslf4jjcl-over-slf4j1.7.13jcl-over-slf4j-1.7.13.jar;C:UsersAsh.m2 epository edisclientsjedis2.8.0jedis-2.8.0.jar;C:UsersAsh.m2 epositoryorgapachecommonscommons-pool22.2commons-pool2-2.2.jar;C:UsersAsh.m2 epositoryorgspringframeworkootspring-boot-starter-test1.2.8.RELEASEspring-boot-starter-test-1.2.8.RELEASE.jar;C:UsersAsh.m2 epositoryorgmockitomockito-core1.10.19mockito-core-1.10.19.jar;C:UsersAsh.m2 epositoryorgobjenesisobjenesis2.1objenesis-2.1.jar;C:UsersAsh.m2 epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;C:UsersAsh.m2 epositoryorghamcresthamcrest-library1.3hamcrest-library-1.3.jar;C:UsersAsh.m2 epositoryorgspringframeworkspring-test4.1.9.RELEASEspring-test-4.1.9.RELEASE.jar;C:UsersAsh.m2 epositoryorg estng estng6.9.10 estng-6.9.10.jar;C:UsersAsh.m2 epositorycomeustjcommander1.48jcommander-1.48.jar;C:UsersAsh.m2 epositoryorgeanshellsh2.0b4sh-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将无法找到这个类,则加载这个类的任务将落在自定义类加载器身上,那么上面的输出结果将会不同