zoukankan      html  css  js  c++  java
  • 面试题思考:如何编写自己的类加载器

    类加载器就是负责检索并加载其他Java类或者资源(如文件)的对象,它一般继承于java.lang.ClassLoader这个抽象类(除了BootstrapClassLoader)。

    实际上,程序中所有的类都是通过类加载器进行加载的,并且它们都持有各自类加载器对象的引用,可以通过java.lang.Class的getClassLoader方法得到。

    一个程序中的各个类加载器构成了一棵树,位于根部的被称作BootstrapClassLoader,它作为Java虚拟机的一部分,它使用C++语言实现,在程序刚启动时就被加载进来,负责Java标准库的加载,并且只有它能完成该任务。

      
    标准扩展(Extension)类加载器负责加载Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库

      
    应用程序(Application)类加载器负责加载系统类路径(CLASSPATH)中指定的类库。同时它常被称为系统(System)加载器,因为我们可以通过getSystemClassLoader()方法来获取它。

      
    而由我们程序员自己编写的类加载器被称为自定义类加载器,如果生成自定义类加载器时没有明确地指出父类加载器,会默认把应用程序(Application)类加载器作为自己的父亲。

      
    类加载器的父子关系相当重要,当你指定由一个类加载器加载某一个类时,它会无论如何先把它交给自己的父类加载器来执行,除非父类加载器检索不到这个类,才会开始尝试自己检索和加载。

    显式使用类加载器的最常见例子就是使用JDBC的第一步——加载数据库驱动,如:

    Class.forName("com.mysql.jdbc.Driver");

    或者

    Class.forName("oracle.jdbc.driver.OracleDriver");

    编写目录型类加载器的代码

    思路很简单,把指定目录追加到类加载器的类路径中即可。

    public static ClassLoader createClassLoader(String dirname) throws java.io.IOException {
        java.net.URL[] url = new java.net.URL[1];
        java.io.File file;
        if (dirname.endsWith("/")) {
            file = new java.io.File(dirname);
        }
        else {
            // 对于目录的路径,最后必须要有'/'
            file = new java.io.File(dirname + "/");
        }
        url[0]= file.toURI().toURL();
    
        ClassLoader parent = ClassLoader.getSystemClassLoader();
        java.net.URLClassLoader loader = new java.net.URLClassLoader(url, parent);
    
        return loader;
    }

    下面以一个实例演示如何使用该类加载器,首先创建一个class目录的类加载器,然后获取test.Main类对象,并调用它的main方法。

    private void foo() throws Exception {
        ClassLoader loader = createClassLoader("./class/");
        Class<?> cls = Class.forName("test.Main", true, loader);
        java.lang.reflect.Method method = cls.getMethod("main", new Class[]{String[].class});
    
        method.invoke(null, new Object[]{null});
    }

    虽然这次演示的是目录,但对于jar文件和zip文件同样可以通过URLClassLoader来加载。

  • 相关阅读:
    uva 12096
    uva 705
    uva 657
    uva 10129
    uva 816 BFS求最短路的经典问题……
    uva 1103
    uva 699
    这是昨天的内容,就这样慢慢整吧,然后,荒废了好多时间啊!!
    今天就这么乱糟糟的过啦~刚刚接触html,就稍微写了一下,明天加油,今天直接贴图
    uva 548 tree
  • 原文地址:https://www.cnblogs.com/songanwei/p/9417286.html
Copyright © 2011-2022 走看看