`
lpj2007
  • 浏览: 5923 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

类加载器(classLoader)

    博客分类:
  • JAVA
阅读更多

1. 类的初始化

 

       Java类从class文件到可以生成对象,需要经历类的加载、连接和初始化。

       依次说明下:

       (1)类的加载:

                查找并加载类的二进制数据,即:将类的.class文件中的二进制数据读入到内存中,将其放在运行时           数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。(说明下:此处所说的方法区就是指JVM启动时分配的一块内存区域,其大小默认为64M,可以通过-XX:PermSize指定,即人们常说的永久代)。此处还需要补充的是当我们的类加载时就已经在堆中生成了Class对象,也就意味着该类的所有对象都共享这一个Class对象,它由jvm自动生成,我们不能生成。

 

         (2)连接:

                  具体包括三个步骤:

                  验证:确保被加载的类的正确性

                  准备:为类的静态变量分配内存,并初始化为默认值

                  解析:把类中的符号引用转换为直接引用(具体含义不太清楚,请高手指教)

 

            (3)初始化:

                    为类的静态变量赋予正确的初始值

 

2. 什么时候初始化?

           这个最容易想到的就是我们new对象的时候,再深入一点就是访问静态变量,仔细想想还有其他的么?呵呵~~ 具体总结如下:

          就是一句话:当Java程序对类主动使用时就进行初始化。那什么叫对类的主动使用呢?如下6中情况就是对类主动使用,除了这六种情况,都是对类的被动使用,不会导致类的初始化。

          主动使用:

                 1) 创建类的实例,这是最容易想到的情况

                 2) 访问类的静态变量,给静态变量赋值。重要:访问的是编译时常量,则不会导致类的初始化。

                 3) 访问类的静态方法

                 4) 反射,如:Class.forName(); 典型的例子是获取JDBC连接时必须先要初始化JDBC驱动。

                 5) 初始化一个类的子类。(关于类的详细初始化顺序见下文)

                 6)JVM启动时被标明为启动类的类,这个不太常见

 

3. 类的加载和初始化的区别:

            说了这么多,有些人可能有点听糊涂了,这两个到底有什么区别呢?关于类的加载是这样的:JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件错误,暂时不会报错,等真正要使用该类的时候才抛出错误。

  由此可以看出来,类的加载并不是确定的、可控的。而初始化则是确定的,即只有对类的主动使用时才会导致类的初始化。 

 

4. 类是如何被加载的

 

两种类型的类加载器:

java虚拟机自带的加载器

根类加载器(Bootstrap): 负责加载核心类库

扩展类加载器(Extension): 它的父加载器为BootStrap,它用来加载jdk/jre/lib/ext下的类库,它是java.lang.ClassLoader的子类

系统类加载器(应用加载器)(System): 它的父加载器为Extension, 它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类。它是用户自定义加载器的默认父加载器。

 

 

父子加载器并非继承关系。也就是说子加载器不一定是父加载器的子类。

 

自定义的加载器必须要继承java.lang.ClassLoader

 

5. 类的完整初始化过程:

1) 类的加载(在方法区中创建Class对象

2) 类的连接(验证、准备、解析)

3) 父类静态变量按照顺序初始化

4) 子类静态变量按照顺序初始化

5) 父类成员变量按照顺序初始化

6) 父类构造器初始化

7)   子类成员变量变量按照顺序初始化

8)   子类构造器初始化

9)    初始化完成

 

 

6) 附一个阿里笔试题,关于初始化的,如果第一次就能答对,那说明对Java初始化就掌握得非常好了

 

public class AliTest {  
    public static int k = 0;  
    public static AliTest s1 = new AliTest("s1");  
    public static AliTest s2 = new AliTest("s2");  
    public static int i = print("i");  
    public static int n = 99;  
    public int j = print("j");  
      
    {  
        print("构造块");  
    }  
    
    static  {  
        print("静态块");  
    }  
      
    public static int print(String s) {  
        System.out.println(++k + ":" + s + "\ti=" + i + "\tn=" + n);  
        ++n;  
        return ++i;  
    }  
      
    public AliTest(String s) {  
        System.out.println(++k+":"+s+"\ti="+i+"\tn="+n);  
        ++i;  
        ++n;  
    }  
  
    public static void main(String[] args) {  
        new AliTest("init");  
    }  

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java类加载器ClassLoader用法解析

    主要介绍了Java类加载器ClassLoader用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    摘要视图订阅曹胜欢欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章登录 | 注册Java程序员从笨鸟到菜鸟(81)3054

    java应用程序类加载器,ClassLoader for java Application

    java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置

    ClassLoader类加载器

    ClassLoader的API使用和自定义

    JAVA ClassLoader 讲解 (类加载器)

    ClassLoader类加载器讲解,理解JAVA类加载机制

    ClassLoader类加载机制

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    Java类加载器(ClassLoader)1

    如果户创建的JAR放在此录下,也会动由扩展类加载器加载.应程序类加载器(系统类加载器,Application ClassLoader)java语编写,由sun.

    java类加载器实例

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java ...

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    Java学习笔记

    类加载器 ClassLoader 字节码校验器 解释执行器 (翻译)逐行的解释执行代码 2.安全 健壮 3.面向对象 面向过程: 程序:函数+变量 (算法+数据结构) 面向对象: 如:SmallTalk 程序:对象和对象相互之间的“通讯” ...

    J2SE笔记讲解个人修订(1.1).docx

    14 JAVA类加载器CLASSLOADER 15 JAVA简单工厂模式 16 JAVA中的注解 17 JAVA 图形界面 18 JAVA多线程 19 JAVA 反射机制 20 JAVA克隆CLONE(复制) 21 JAVA 网络编程 22 JAVA 其他未归类 23 JNI概述

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    classloader类加载器_基于java类的加载方式详解

    下面小编就为大家带来一篇classloader类加载器_基于java类的加载方式详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java的ClassLoader类加载器机制

    jvm运行的过程中,需要载入类,而类的加载需要类加载器,本文章提供了java的类加载器的工作原理。可以使读者更加理解jvm的运行机制。

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    掌握Java类加载器

    类加载器是Java最强大的特征之一。但是开发者常常忘记类加载组件。类加载器是在运行时负责寻找和加载类文件的类。Java允许使用不同的类加载器,甚至自定义的类加载器。类加载器从源文件(通常是.class 或 .jar文件)...

    类加载器,classload

    关于类加载器的 上课ppt -java虚拟机自带的加载器 根类加载器(Bootstrap) c++写的看不到扩展类加载器(extension) 系统类加载器(System) AppClassLoad 用户自定义的类加载器 Java.lang.ClassLoader的子类

    自定义类加载器

    简单的自定义类加载器问候世界hello word,基于磁盘的ClassLoader

    java类加载器

    ClassLoader 三种类加载方式 Boostrap Extenxsion 以及Application ClassLoad分别适用的场景

    Java类加载机制与反射-PPT

    Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射

Global site tag (gtag.js) - Google Analytics