文档章节

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
粉丝 59
博文 39
码字总数 48903
作品 0
杭州
程序员
java项目与javaweb项目导入jar包的区别

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

低调的AckMan
2015/12/11
1K
0
java进阶之路

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

旋转木马-千里马
2016/01/19
279
0
java技术路线

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

罗文浩
2015/11/26
193
1
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

没有更多内容

加载失败,请刷新页面

加载更多

负载均衡的解决方案有哪些

负载均衡器服务可满足大型组织的需求,支持所有数据中心和跨数据中心高可靠性场景。 本地负载均衡,通过附带或者未附带持久性覆盖选项,Incapsula支持各种负载均衡算法,以优化服务器之间的流...

上树的熊
10分钟前
0
0
Java实现在线打开word文档加盖印章/盖章/签名功能

前言: 我们知道,大型一点的OA办公系统都会有很多在线处理office办公文档的需求。其中有一点也基本绕不开,那就是为文档盖章或添加手写签名来保护文档,让被盖章的文档不再被编辑。 在Java中...

山里的红杏
18分钟前
3
0
js控制输入正负数,小数点后保留两位

//限制数字function clearNoNum(obj){ //修复第一个字符是小数点 的情况. if(obj.value !=''&& obj.value.substr(0,1) == '.'){ obj.value=""; } obj.value ...

一直在成长的程序猿
21分钟前
1
0
动态代理

具体场景 为了使代理类与被代理类对第三方有相同的函数,代理类与被代理类一般实现一个公共的interface,定义如下 public interface Subject { void rent(); void hello(String s)...

wuyiyi
24分钟前
0
0
时间字段

我们看看这几个数据库中(mysql、oracle和sqlserver)如何表示时间 mysql数据库:它们分别是 date、datetime、time、timestamp和year。date :“yyyy-mm-dd”格式表示的日期值 time :“hh:...

DemonsI
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部