文档章节

JavaWeb学习之——ClassLoader

lizo
 lizo
发布于 2016/12/12 21:37
字数 804
阅读 14
收藏 1

概述

在java中,ClassLoader负责把一个java类加载进Java虚拟机。为了防止重复加载和安全性方便的考虑,ClassLoader是具有层次结构的。

1.ClassLoader类

ClassLoader的主要方法包括:

1.1 defineClass

    protected final Class<?> defineClass(String name, byte[] b, int off, int len)
        throws ClassFormatError
    {
        return defineClass(name, b, off, len, null);
    }

通过defineClass是将byte数组转换为JVM能够识别的对象,可以看出,字节数组可以来自本地,网络等途径

1.2 findLoadedClass

    protected final Class<?> findLoadedClass(String name) {
        if (!checkName(name))
            return null;
        return findLoadedClass0(name);
    }

通过类的全名来加载一个类

1.3 loadClass

    protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先检查class是否已经加载
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // 当父classLoader没有加载的成功的时候抛出异常
                }

                if (c == null) {
                    // 如果还还加载成功,试图调用findClass来加载类
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // 记录状态
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

可以看出,加载类的时候都是先从父类中加载

1.3 findClass

    protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }

findClass默认是没有任何实现的,只是抛出异常,因此我们可以覆盖该方法, 重写我们自己的类加载途径

代码例子:怎么使用classLoader加载自定义byte数组并通过反射调用其中方法

https://git.oschina.net/null_584_3382/java-web-example/tree/master

2. ClassLoader等级加载机制

从文章前面的描述中,可以看出 class loader在加载类的时候,优先是从其父加载器中加载,并且每个Class Loader 都有一个字段指向其父加载器(如果没有指定默认为AppClassLoader)

ClassLoader的层次结构:

上面的图是随便找的,下面简单介绍一下

2.1 BootStrap ClassLoader

这个类是为JVM自己服务的,加载JVM自身工作所需要的类,这个类完全是由JVM自己控制的。该类其实并不遵守前面所规定的等级加载制度。这个类即没有父加载器,也没有子加载器。

2.2 ExtClassLoader 

这个加载器主要用于加载 java.ext.dirs目录下的类,也算是一种特殊的类加载器,他是往上能追溯到的最高加载器

2.3 AppClassLoader

这个类就是专门为我们使用的,他的父加载器ExtClassLoader ,所有在ClassPath下的类都由他加载(前提你没有定义其他自己的ClassLoader)。我们自己实现的ClassLoader的父加载器就是这个类。

ExtClassLoader 和AppClassLoader都是Launch的内部类,都继承URLClassLoader,而URLClassLoader又继承ClassLoader。

2.4 java加载ClassLoader 的方式

第一种方式是隐式加载方式,加载一个类的时候,如果他的父类没有加载,就会先加载其父类(顺带说一句,自己实现ClassLoader 的时候,也要准守先从父加载器中加载,不然加载到Java.xxx 的类的时候,就会提示报错,因为 java.xxx 的类是不允许从其他地方加载的)

第二种方式是显示加载,也就是我们自己显示使用loadClass方法加载

// TODO

© 著作权归作者所有

共有 人打赏支持
lizo
粉丝 58
博文 39
码字总数 48903
作品 0
杭州
程序员
java技术路线

在技术方面无论我们怎么学习,总感觉需要提升自已,却又不知道从哪里着手,同时也不知道自己处于哪个水平。这时候就需要有清晰的指示图来指引我们,这样我们能清楚的知道我们在哪方面不足,以...

罗文浩
2015/11/26
193
1
java进阶之路

Java程序员 高级特性 反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入 核心编程 IO、多线程、实体类、集合类、正则表达式、XML和属性文件 ·图形编...

旋转木马-千里马
2016/01/19
279
0
Java开发手册及JavaWeb工程师的成长及实践(及进阶)

> 进阶 个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能- http://geek.csdn.net/news/detail/246999 成为一名合格软件工程师的7点建议- http://blog.csdn.net/dev_csdn/artic...

shareus
2016/03/03
0
0
Java Web学习计划

--- 本月为入门阶段,从零开始,一步一步的做出一个实用的网站。 深入学习Java语言,初步掌握前端技术,使用JSP和MySQL完成一个简单的网站 第1周 Java高级编程学习目标:
1.深入了解JDK环境...

SVD
2016/12/01
55
0
Java虚拟机技术总结(07年写的,原JavaEye精华)

近段时间,我们项目中用到的WebSphere应用服务器(WAS),但在客户的production环境下极不稳定,经常宕机。给客户造成非常不好的影响,同时,也给项目组很大压力。为此,我们花了近一个月时间对...

爱在昨天
2013/09/14
276
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Akka的Actor生命周期《Eight》译

Actor在创建时出现,然后在用户请求时停止。每当一个Actor停止时,它的所有孩子也会被递归停止。此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引起的资源泄漏...

woshixin
9分钟前
0
0
Python 线程 条件锁 生产者消费者模型

创建多个生产者和消费者,并且加上条件锁,避免线程冲突 import threadingfrom threading import Threadfrom threading import Conditionimport timeimport randomc = Conditi...

阿豪boy
25分钟前
0
0
【七】组合Action

本章描述了常用定义Action的方法。 自定义action builders 我们在action一章已经看过如何声明一个action——有request parameter、无request parameter、有body parser等等。你可以在 asynch...

Landas
42分钟前
0
0
Spring Boot实战之基础回顾

本文作者: 吴伟祥 本文链接: https://wuweixiang.cn/2018/08/21/Spring-Boot实战之基础回顾/ 版权声明: 本博客所有文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议。转载请在文章开...

吴伟祥
42分钟前
0
0
OAuth认证开发

提示: 以下测试是基于项目安装成功,初始化数据库(initial_db.ddl, oauth.ddl, initial_data.ddl)后的测试, 也可在页面上点击"client_details"菜单里进行测试 方式1:基于浏览器 (grant_type=...

舒文joven
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部