zoukankan      html  css  js  c++  java
  • JVM启动过程 类加载器 【待删除】

    下图来自: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将无法找到这个类,则加载这个类的任务将落在自定义类加载器身上,那么上面的输出结果将会不同

  • 相关阅读:
    HttpWatch 有火狐版本?
    JQgrid的最新API
    jqgrid
    JSON的学习网站
    array创建数组
    Numpy安装及测试
    SQLite3删除数据_7
    SQLite3修改数据_6
    SQLite3查询一条数据_5
    SQLite3查询所有数据_4
  • 原文地址:https://www.cnblogs.com/heben/p/7083149.html
Copyright © 2011-2022 走看看