文档章节

JavaWeb学习之——ClassLoader

lizo
 lizo
发布于 2016/12/12 21:37
字数 804
阅读 14
收藏 1
点赞 0
评论 0

概述

在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总结文章

java总结文章 原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Talk is cheap. Show me the code. Written In The Font   图能抵过一切,喜欢咖啡喜...

泥沙砖瓦浆木匠 ⋅ 2014/06/08 ⋅ 2

java技术路线

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

罗文浩 ⋅ 2015/11/26 ⋅ 1

java进阶之路

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

旋转木马-千里马 ⋅ 2016/01/19 ⋅ 0

Java开发手册及JavaWeb工程师的成长及实践(及进阶)

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

shareus ⋅ 2016/03/03 ⋅ 0

Java虚拟机技术总结(07年写的,原JavaEye精华)

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

爱在昨天 ⋅ 2013/09/14 ⋅ 0

Java Web学习计划

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

SVD ⋅ 2016/12/01 ⋅ 0

知识总结 插件化学习 Activity加载分析

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

CankingApp ⋅ 2017/05/19 ⋅ 0

从java程序员到CTO的成长路线图

很多新人不知道从事java开发,具体的发展路径是怎么样的,甚至很多人都不能区分程序猿和攻城师的区别。包括不少小白,从事java开发都半年,甚至1年了,对职业发展还没有清晰的认证。这非常不...

6pker ⋅ 2013/10/24 ⋅ 2

知识总结之 插件化基础ClassLoader

安卓插件化技术已经作为一个优秀的合格研发必备要求,学习和掌握现有不同种类动态加载方案 是提升个人技术深度有效途径。 插件化基础 ClassLoader ClassLoader是什么? ClassLoader 是将jav...

CankingApp ⋅ 2017/05/05 ⋅ 0

java项目与javaweb项目导入jar包的区别

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

低调的AckMan ⋅ 2015/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 24分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 24分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 28分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 41分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 46分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 56分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 今天 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 今天 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 今天 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部