Tomcat载入器(一)

在了解tomcat的载入器时,首先需要了解的是java的类加载部分的内容。

在java体系中,系统分为3中类型的加载器

1.启动类加载器(Bootstrap ClassLoader):加载对象为java核心库,采用c/c++实现,并不继承java.lang.ClassLoader,负责加载java_home/jre/lib目录下的类库,同时也属于JVM的一部分,在JVM启动时,将被加载到内存中。启动类加载器不能被java程序直接使用。

2.扩张类加载器(Extension ClassLoader): 加载对象为java扩张库,即java_home/jre/lib/ext目录下面的类,这个类由启动类加载器加载,它的父类加载器为启动类加载器。

3.应用程序类加载器(Application ClassLoader):也成为系统类加载器(System ClassLoader)它负责加载用户路径(classpath)指定的类库,它也是有启动类加载器加载,它的父类加载被设置为启动类加载器,可以通过ClassLoader.getSystemClassLoader()获取。

tip:启动类加载器是扩展类加载器的父类加载器,并不是继承关系。

越重要的类加载器就越早被载入JVM,这是考虑到安全性,因为先加载的类加载会充当下一个类加载器的父类加载器,在双亲委托模型机制下,就能确保安全性。双亲委托模型会在类加载加载类时,首先委托父类加载器进行加载,如果父类加载器不能加载,才自己加载。这种机制有效的保证java的安全。

类加载的流程图。

下面用2个例子实现自定义的类加载器。

1.采用JVM的双亲委托机制实现。

测试类: Test.java

package com.test.load;
public class Test {
public Test(){
System.out.println(this.getClass().getClassLoader().toString());
}
}

MyClassLoader.java

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; public class MyClassLoader extends ClassLoader
{ private String name; public MyClassLoader(ClassLoader parent, String name)
{
super(parent);
this.name = name;
}
@Override
public String toString()
{
return "test:::"+this.name;
} @Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
is = new FileInputStream(new File("F:/work/web/Test.class"));
int c = 0;
while(-1 != (c = is.read())){
baos.write(c);
}
data = baos.toByteArray();
} catch (Exception e)
{
e.printStackTrace();
}finally{
try
{
is.close();
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
return this.defineClass(name, data, 0, data.length);
}
public static void main(String[] args)
{
MyClassLoader loader = new MyClassLoader(MyClassLoader.class.getClassLoader(), "MyClassLoader");
Class clazz;
try
{
clazz = loader.loadClass("com.test.load.Test");
Object object = clazz.newInstance();
} catch (Exception e)
{
e.printStackTrace();
}
}
}

2.采用打破委托机制。

public class MyClassLoader2 extends ClassLoader
{ private String name; public MyClassLoader2(ClassLoader parent, String name)
{
super(parent);
this.name = name;
}
@Override
public String toString()
{
return "test2:::"+this.name;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException
{
Class<?> clazz = null;
ClassLoader systemLoader = getSystemClassLoader();
try
{
//打破委托机制
clazz = systemLoader.loadClass(name);
} catch (Exception e)
{
//忽略错误
//e.printStackTrace();
}
if(clazz != null)
return clazz;
//自己加载
clazz = findClass(name);
return clazz;
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException
{
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try
{
is = new FileInputStream(new File("F:/work/web/Test.class"));
int c = 0;
while(-1 != (c = is.read())){
baos.write(c);
}
data = baos.toByteArray();
} catch (Exception e)
{
e.printStackTrace();
}finally{
try
{
is.close();
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
return this.defineClass(name, data, 0, data.length);
}
public static void main(String[] args)
{
MyClassLoader2 loader = new MyClassLoader2(MyClassLoader2.class.getClassLoader(), "MyClassLoader2");
Class clazz;
try
{
clazz = loader.loadClass("com.test.load.Test");
Object object = clazz.newInstance();
} catch (Exception e)
{
e.printStackTrace();
}
}
}

还可以测试一下类加载的流程是否正确,先将Test.class文件移走,看程序是出现ClassNotFoundException异常。

Tomcat学习笔记(七)的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  3. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  5. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  6. iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】

    iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...

  7. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  8. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  9. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

随机推荐

  1. C#+Winform记事本程序

    第17章 记事本 如何使用Visual C# 2010设计一个Windows应用程序——记事本,学习,可以进一步掌握MenuStrip(菜单).ToolStrip(工具栏).RichTextBox(高 ...

  2. Java中堆、栈,静态方法和非静态方法的速度问题

           一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储 ...

  3. IntelliJ IDEA 方法注释教程

    首先Ctrl +Alt +S ,打开Settings ,找到Live Template,然后点击右侧的绿色的“+”,选择Template Group 然后给新建的Group随便命个名 选中自己刚才创建 ...

  4. 汇编:输出寄存器AX中的内容

    DATAS segment Temp db '0000H','$' DATAS ends CODES segment START: mov AX,DATAS mov DS,AX ;正式代码开始 mov ...

  5. Dapper and Repository Pattern in MVC

    大家好,首先原谅我标题是英文的,因为我想不出好的中文标题. 这里我个人写了一个Dapper.net 的Repository模式的底层基础框架. 涉及内容: Dapper.net结合Repository ...

  6. 关于IT人的一些消遣区

    https://www.csdn.net/http://www.51cto.com/http://bestcbooks.com/http://www.jobbole.com/http://www.co ...

  7. Error: Cannot find module 'core-js/fn/array/values' at Function.Module._resolveFilename (module

    E:\codeBase\top605\rescue-master\server\node_modules\_log4js@1.1.1@log4js\lib\log4js.js:321 throw ne ...

  8. 20145202课后题,2.56&9.16

    我做的是2.56题,要求我用多组值来测试show_bytes 9.16 主要是对局部性进行了一些分析. 实验楼里面是空的,我电脑上显示不出来,所以我就做了一些书上的习题. 第十章的所有题目都被学长做过 ...

  9. python开发记录第一篇

    1. 安装pyCharm,下载地址https://www.jetbrains.com/pycharm/ 2. 注册license,修改windwos系统hosts,文件路径为:C:\Windows\S ...

  10. dubbo本地搭建实例

    项目文件下载地址:http://download.csdn.net/detail/aqsunkai/9552711 概述     Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服 ...