1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这    个类并初始化。
    类Main:

java 代码
  1. public class Main {
  2. public static void main(String[] args) {
  3. A a = new A();
  4. a.print();
  5. B b = new B();
  6. b.print();
  7. }
  8. }

类A:

java 代码
  1. public class A   {
  2. public void print() {
  3. System.out.println("Using Class A");
  4. }
  5. }

类B:

java 代码
  1. public class B {
  2. public void print() {
  3. System.out.println("Using Class B");
  4. }
  5. }

执行:java -varbose:class Main
执行结果:
    E:\DEV>java -verbose:class Main
    [Opened C:\Program Files\Java\jre1.5.0_11\lib\rt.jar] (类装载器会首先加载rt.jar加载基础类)
    .
    .
    [Loaded Main from file:/E:/DEV/] (类装载器载入相应类并初始化)
    [Loaded A from file:/E:/DEV/]
    Using Class A
    [Loaded B from file:/E:/DEV/]
    Using Class B
2. 让JAVA程序具有动态性
   使用显式方式来实现动态性,我们需要自己动手处理类载入时的细节部分。

两种方法:
    |
    +-- 隐式的 : 使用new关键字让类加载器按需求载入所需的类
    |
    +-- 显式的 :
               |
                     +-- 由 java.lang.Class的forName()方法加载
                     |
               +-- 由 java.lang.ClassLoader的loadClass()方法加载

(1) 使用Class.forName()
    Class.forName()方法具有两个重载的方法:
            +- public static Class forName(String className)
            |
            +- public static Class forName(String className, boolean initialize,ClassLoader loader)
    参数说明:
        className - 所需类的完全限定名
        initialize - 是否必须初始化类(静态代码块的初始化)
        loader - 用于加载类的类加载器
调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)。
这两个方法,最后都要连接到原生方法forName0(),其定义如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一个参数的forName()方法,最后调用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三个参数的forName(),最后调用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类 + 运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。

(2) 直接使用类加载器
       +— 获得对象所属的类 : getClass()方法
           |
           +— 获得该类的类加载器 : getClassLoader()方法

java 代码
  1. public class Main3 {
  2. public static void main(String[] args) throws Exception {
  3. Main3 main3 = new Main3();
  4. System.out.println("准备载入类");
  5. ClassLoader loader = main3.getClass().getClassLoader();
  6. Class clazzA = loader.loadClass(args[0]);
  7. System.out.println("实例化类A");
  8. A o1 = (A) clazzA.newInstance();
  9. }
  10. }

3 类加载器的层次

转载于:https://www.cnblogs.com/macula7/archive/2010/01/20/1960543.html

Java类加载文章1(z)相关推荐

  1. Java类加载文章2(z)

    java是具有动态性,什么是动态性?有个最直观的例子:windows系统的即插即用,支持即插即用的设备可以在系统不重新启动的情况下既可以热把插使用.而java的动态性表现在:我们的程序可以不用全盘的重 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa {static ...

  3. 谈谈 Java 类加载机制

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...

  4. 80070583类不存在_结合JVM源码谈Java类加载器

    一.前言 之前文章 加多:ClassLoader解惑​zhuanlan.zhihu.com 从Java层面讲解了Java类加载器的原理,这里我们结合JVM源码在稍微深入讲解下. 二.Java类加载器的 ...

  5. Java高级篇——深入浅出Java类加载机制

    转载自 Java高级篇--深入浅出Java类加载机制 类加载器 简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存. 类加载器分类 从虚拟机层面讲分为两大类型的类加载 ...

  6. java 加载类java_深入研究Java类加载机制

    深入研究Java类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比 ...

  7. java类加载体系,Java类加载体系

    早期的java程序员可能只要懂基本语法,还有少数的项目经验就可以找到一份比较好的工作.Java和java社区的发展,更多的人了解它,深入它.现在java程序员了解一些语法我看还远远不够了,对于jvm的 ...

  8. 小黑框运行java_初探Java类加载机制

    初探Java类加载机制 一.在jdk1.2以后,类加载是通过委托来完成的,这意味着如果 ClassLoader 不能找到类,它会请求父代 ClassLoader 来执行此项任务,所有 ClassLoa ...

  9. Java类加载原理解析(转)

    1       基本信息 摘要: 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加 ...

最新文章

  1. 2021.NET大会日程首发!行程亮点全曝光!
  2. 微信小程序本地存储存储_如何利用本地存储构建快速的应用程序
  3. maven release插件将一版本发布到仓库中时Return code is: 401, ReasonPhrase:Unauthorized
  4. linux mysql-proxy 0.8.0_mysql主从复制及mysql-proxy0.8安装
  5. ubuntu16.04下ROS操作系统学习笔记(二)命令工具了解和仿真小海龟
  6. 战之六 使用ADMT 3.2迁移用户和计算机
  7. Gallery 3D+倒影 滑动切换图片示例
  8. 终于理解你的软件 搞那么多年了 (通用权限管理系统组件源码完善了7-8年)
  9. 二维向量叉乘的简单介绍及应用
  10. java 颜色渐变算法_颜色渐变的RGB计算
  11. 计算机可以谭音乐吗,谭晶怎么被叫谭哈哈 《歌手》谭晶演唱什么歌曲
  12. flowable审批流+集成springboot
  13. 阿里总参谋长曾鸣:区块链中没有绝对的“去中心化”
  14. ubuntu18.04双系统解决进入桌面后鼠标和键盘失灵问题
  15. root后顽固木马,手机中顽固木马无法root怎么办
  16. 苹果充电时一充一停怎么办_苹果充电线一会儿能充一会儿不能充怎么回事
  17. 一正云系统服务器搭建,腾正云服务器
  18. 台式计算机识别不了u盘启动,台式机装系统读取不出U盘怎么解决
  19. DecoHack #015 独立产品灵感周刊 - 合格的开发者应该具备的工具
  20. MATLAB卡尔曼滤波-实例

热门文章

  1. 系统程序员成长计划-组合的威力
  2. 后台开发经典书籍--大型网站技术架构:核心原理与案例分析
  3. golang中的os包
  4. 下面中???该如何填写,才可以正确执行强制类型转换? int (*monthp)[31]; monthp = (???)malloc(31);
  5. CC2530中常用的控制寄存器
  6. c++中利用sizeof运算符计算结构体大小问题探讨
  7. 云计算开发技术,Python自动化运维开发实战三部分
  8. PHP 5.6.32 增加pdo_dblib.so拓展
  9. 10.5 QQ 支持
  10. scrapy-splash抓取动态数据例子六