纸上得来终觉浅,绝知此事要躬行
 --陆游       问渠那得清如许,为有源头活水来  --朱熹

一个类从被加载到内存中开始到卸载出内存为止,它的整个生命周期包括了:加载(loading)、验证(Verification)、准备(Preparetation)、解析(Resolution)、
初始化(Initialization)、使用(Using)、卸载(Uploading)七个阶段。其中验证’准备和解析称为链接。


一、ClassLoader类加载的架构

 1)、Bootstrap Classloader启动类加载器,主要负责java_home/lib下的核心api或者-Xbootstrap选项指定的jar包装入工作。
 2)、Extension ClassLoader扩展类加载器,主要负责java_home/lib/ext下jar包
 3)、App CLassLoader 系统类加载器,主要负责Java -classpath/所指的目录下的类与jar包的装入工作;
 4)、 UserCustom ClassLoader用户自定义类加载器,在程序运行期间,通过Java.lang.Classloader的子类动态加载class

二、类加载的特性
1)、每一个ClassLoader都会维护一个自己的命名空间,同一个命名空间不能出现两个相同的类名
2)、为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构。

三、类的加载方式有三种:
1)、命令行启动应用时由JVM初始化加载。
2)、通过class.forName()方法动态加载。
3)、通过ClassLoader().loadClass()方法动态加载。
这三种加载方式对静态代码块的执行有影响。
如下例子:
public class MyHello {
    static
    {
        System.out.println("hello word");
    }
}

public class Hello {

    public static void main(String[] args) {
        ClassLoader loader=Hello.class.getClassLoader();
        try {
            //静态代码块不运行
            //loader.loadClass("Test.MyHello");

            //静态代码块运行输出hello world
            //Class.forName("Test.MyHello");

            //静态代码块不运行
            //Class.forName("Test.MyHello", false, loader);

            //静态代码块运行输出hello world
            Class.forName("Test.MyHello", true, loader);

        } catch (ClassNotFoundException e) {
            // TODO 自动生成的 catch             e.printStackTrace();
        }
    }
}

一、ClassLoader类加载的架构

 1)、Bootstrap Classloader启动类加载器,主要负责java_home/lib下的核心api或者-Xbootstrap选项指定的jar包装入工作。
 2)、Extension ClassLoader扩展类加载器,主要负责java_home/lib/ext下jar包
 3)、App CLassLoader 系统类加载器,主要负责Java -classpath/所指的目录下的类与jar包的装入工作;
 4)、 UserCustom ClassLoader用户自定义类加载器,在程序运行期间,通过Java.lang.Classloader的子类动态加载class

Java 类加载机制 ClassLoder的更多相关文章

  1. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

  2. Java 类加载机制

    类的加载: 类的初始化: 类什么时候才被初始化:1)创建类的实例,也就是new一个对象2)访问某个类或接口的静态变量,或者对该静态变量赋值3)调用类的静态方法4)反射(Class.forName(&q ...

  3. Java类加载机制深度分析

    转自:http://my.oschina.net/xianggao/blog/70826 参考:http://www.ibm.com/developerworks/cn/java/j-lo-class ...

  4. 理解Java类加载机制(译文)

    理解java类加载机制 你想写类加载器?或者你遇到了ClassCastException异常,或者你遇到了奇怪的LinkageError状态约束异常.应该仔细看看java类的加载处理了. 什么是类加载 ...

  5. 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

    剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...

  6. 两道面试题,带你解析Java类加载机制

    文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...

  7. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  8. Java类加载机制的理解

    算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...

  9. Java类加载机制与Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

随机推荐

  1. PHP HTTP 函数

    PHP HTTP 简介 HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. 安装 HTTP 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP ...

  2. 两行代码搞定Android视图扩散切换效果

    用最简单的方式来实现Android视图扩散切换效果. 一.概述 这两天时间动手撸了个视图扩散切换效果的控制器,API兼容至Android4.0,更方便我们在视图切换过程中有炫酷的过渡效果.本来是想实现 ...

  3. nginx时间设置解析函数

    https://trac.nginx.org/nginx/browser/nginx/src/core/ngx_parse.c /* * Copyright (C) Igor Sysoev * Cop ...

  4. 手势监听GestureDetector 案例

    以下只做长按和甩出(用户按下朝某一方向甩动手指)案例 OnGestureListener可以查看到更多的手势事件 案例 package com.qf.mobliesafe.activity; impo ...

  5. RDO Stack Exception: UnboundLocalError: local variable 'logFile' referenced before assignment

    Issue: When you install RDO stack on CentOS, you may encounter following error. Error: [root@localho ...

  6. 供应商导入的API补充(详解EBS接口开发之供应商导入)

    --供应商 --创建 AP_VENDOR_PUB_PKG.Create_Vendor ( p_api_version IN NUMBER, p_init_msg_list IN VARCHAR2 := ...

  7. 在Linux上的虚拟机上启动Oracle上报ORA-00845: MEMORY_TARGET not supported on this system的问题解决

    解决办法: 1.将当前虚拟机的内容调整大一些(以下转载:http://jingyan.baidu.com/article/414eccf67b8baa6b421f0a60.html) VMware虚拟 ...

  8. 《高性能MySQL》读书笔记(上)

    <High Performance MySQL>真是本经典好书,从应用层到数据库到硬件平台,各种调优技巧.常见问题全都有所提及.数据库的各种概念技巧平时都有接触,像索引.分区.Shardi ...

  9. 自定义AlertDialog(仿微信)

    安卓自定义AlertDialog,原理很简单: AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).create(); di ...

  10. UNIX网络编程——tcp流协议产生的粘包问题和解决方案

    我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...