文档章节

JavaWeb学习之——ClassLoader

lizo
 lizo
发布于 2016/12/12 21:37
字数 804
阅读 15
收藏 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
粉丝 60
博文 40
码字总数 50118
作品 0
杭州
程序员
私信 提问
java技术路线

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

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

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

旋转木马-千里马
2016/01/19
279
0
java项目与javaweb项目导入jar包的区别

现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别: java项目: 在classLoader加载jar和class的时候,是分开加载的,一般jar导入分两种: 1.在...

低调的AckMan
2015/12/11
1K
0
知识总结 插件化学习 Activity加载分析

现在安卓插件化已经很成熟,可以直接用别人开源的框架实现自己项目,但是学习插件化的实现原理是安卓研发工程师加深安卓系统理解的很好途径。 安卓插件化学习 插件Activity加载方式分析 实现...

常兴E站
2017/05/19
0
0
Java虚拟机技术总结(07年写的,原JavaEye精华)

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

爱在昨天
2013/09/14
418
0

没有更多内容

加载失败,请刷新页面

加载更多

传播正能量——《海南英才》阅读的读后感2200字

传播正能量——《海南英才》阅读的读后感2200字: 新华社记者12月8日从公安部获悉,针对自媒体“网络水军”敲诈勒索等违法犯罪活动突出问题,今年以来,公安部组织各地公安机关依法深入开展侦...

原创小博客
16分钟前
1
0
Confluence 6 对一个空间进行归档后产生的影响

空间 如果一个空间被归档: 将不会在查找结果中显示,除非你选择 在归档空间中查找(Search archived spaces)。如果没有归档空间的话,这个功能是隐藏的。 页面和内容将不会在 Confluence 的...

honeymose
18分钟前
2
0
java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
今天
4
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
10
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部