`

java类加载的表现形式(zz)

阅读更多
java中的类是动态加载的,我们先看一下我们常用的类加载方式,先有一个感性的认识,才能进一步
深入讨论,类加载无非就是下面三种方式。
class A{}
class B{}
class C{}
public class Loader{
    public static void main(String[] args) throws Exception{
       Class aa=A.class;
       Class bb=Class.forName("B");
       Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
    }
}
我们先看.class字面量方式,很多人可能不知道这种方式,因为这种用法不是一般java语法。
通过javap我们可以发现,这种方式的大致等价于定义了一个静态成员变量
    static Class class$0;(后面的编号是增长的)
你可以试图再定义一个  static Class class$0,应该会收到一个编译错误(重复定义)。
Class aa=A.class;
就相当于
    if(class$0==null){
try{
           Class.forName("A");
}
cacth(ClassNotFoundException e){
    throw new NoClassDefFoundError(e);
}
    }
    Class aa=class$0;
可以很清楚的看到,这种类的字面量定义其实不是加载类的方式,而是被编译器处理了,实质
上是使用了Class.forName方法,但是使用这种方式有一个很大的好处就是不用处理异常,因为
编译器处理的时候如果找不到类会抛出一个NoClassDefFoundError。也许你觉得需要处理
ClassNotFoundException这种异常,事实上99%的情况下我们可以把这种异常认为是一个错误。
所以大部分情况我们使用这种方式会更简洁。
最常用的方式就是Class.forName方式了,这也是一个通用的上层调用。这个方法有两个重载,
可能很多人都忽略了第二个方法。
public static Class forName(String name) throws ClassNotFoundException
public static Class forName(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException
第二个方法后面多了两个参数,第二个参数表示是否初始化,第三个参数为指定的类加载器。
在上面的例子中:
Class bb=Class.forName("B");等价于
Class bb=Class.forName("B",true,Loader.class.getClassLoader());
这里要详细说一下这个类的初始化这个参数,如果这个参数为false的话,
类中的static成员不会被初始化,static语句块也不会被执行。
也就是类虽然被加载了,但是没有被初始化,不过在第一次使用时仍然会初始化。
所以我们有时候会看到Class.forName("XXX").newInstance()这样的语句,为什么这里要创建一个
不用的实例呢?不过是为了保证类被初始化(兼容以前的系统)。
其实第二个方法是比较难用的,需要指定类加载器,如果不指定而且又没有安装安全管理器的化,
是无法加载类的,只要看一下具体的实现就明白了。
最本质的方式当然是直接使用ClassLoader加载了,所有的类最终都是通过ClassLoader加载的,
Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
这里通过使用系统类加载器来加载某个类,很直接的方式,但是很遗憾的是通过这种方式加载类,
类是没有被初始化的(也就是初始化被延迟到真正使用的时候).不过我们也可以借鉴上面的经验,加载
后实例化一个对象Class cc=ClassLoader.getSystemClassLoader().loadClass("C").newInstance()。
这里使用了系统类加载器,也是最常用的类加载器,从classpath中寻找要加载的类。
java中默认有三种类加载器:引导类加载器,扩展类加载器,系统类加载器。
java中的类加载有着规范的层次结构,如果我们要了解类加载的过程,需要明确知道哪个类被谁
加载,某个类加载器加载了哪些类等等,就需要深入理解ClassLoader的本质。
以上只是类加载的表面的东西,我们还将讨论深层次的东西。
原文:http://dev.csdn.net/author/treeroot/a481eb323af84caab1149221432e46b9.html
http://www.yesky.com/SoftChannel/72342371961929728/20050212/1911003.shtml
http://www.blogjava.net/hopeshared/archive/2006/10/23/76779.html
分享到:
评论

相关推荐

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    阿里巴巴java笔试zz.

    1. 肯尼迪总统的讲话假设:这是一道逻辑推理题,与Java编程技术无关,但可以考察逻辑思维能力。肯尼迪的讲话假设美国石油公司只关心利润,不顾政府的指示。 2. 专利意识与企业行为:此题考察的是对企业专利工作的...

    聊天工具的java开发 超越QQ 天翔ZZ

    《聊天工具的Java开发:超越QQ,天翔ZZ》 在IT行业中,开发一款聊天工具是一项挑战性十足的任务,尤其当目标是超越如QQ这样的巨头时。本文将深入探讨使用Java语言开发聊天工具的关键知识点,结合"天翔ZZ"这个项目,...

    基于Java与HTML的studyjava-zz设计源码,深入探索Java编程新视野

    该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...

    (zz)java集合类总结

    ### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...

    Zz: java 线程池设计思想

    线程池的实现主要依赖于Java的`java.util.concurrent`包中的`ExecutorService`接口和`ThreadPoolExecutor`类。`ExecutorService`是线程池服务的入口,它定义了线程池的主要操作,如执行任务、关闭线程池等。而`...

    zz.rar_JAVA俄罗斯方块

    本项目“zz.rar_JAVA俄罗斯方块”提供了一套完整的JAVA源代码,让开发者可以深入理解如何用JAVA语言实现这个经典游戏。本文将详细解析该项目中的关键知识点,帮助读者更好地理解和掌握JAVA编程技巧。 1. **JAVA基础...

    zz牌类小游戏24点

    "zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...

    java中四个核心思想

    Java源代码经过编译后会生成`.class`文件,这些文件包含了Java字节码,是Java程序在JVM上运行的形式。每个`.class`文件代表了一个Java类,并且包含该类的方法定义、字段声明以及其他元数据信息。Java class文件具有...

    Java语言基础入门教程 Java实训教程 14.嵌套类等 共34页.pptx

    ### Java语言基础入门教程:嵌套类详解 #### 一、概述 《Java语言基础入门教程》中的第14章主要介绍了嵌套类的相关概念及其使用方法。本章旨在通过详细的解析帮助读者理解和掌握嵌套类的基础知识以及如何在实际...

    zz CAD快速计算长度插件

    在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。

    java实现logistic回归算法

    - **模型保存与加载**:使用序列化技术如Java的Serializable接口保存和加载模型。 4. **Java库的使用** - **Apache Commons Math**:提供了一些数学工具,如矩阵运算、优化算法等,适合实现Logistic回归。 - **...

    ZZ561401.CAB

    ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB

    Aspose.cad19.5+dwg使用Java转pdf

    在Java项目中,你可以通过Maven或Gradle等构建工具添加依赖,或者直接将jar包添加到项目的类路径中。 下面是一个简单的Java代码示例,展示了如何使用Aspose.cad进行DWG到PDF的转换: ```java import ...

    wincc AX NF ZZ

    wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。

    Java图形界面学生签到考勤系统MySQL数据库.zip

    Java图形界面学生签到考勤系统是一个利用MySQL数据库进行数据存储的软件应用,它专为在校学生设计,旨在简化考勤流程,提升签到效率。系统通过集成指纹识别技术,确保了签到的准确性和安全性,同时实现了师生对学生...

    JAVA源码Java火影忍者游戏源代码

    - **代码结构**:通常,一个Java游戏项目会包含多个包(package),每个包下又会有多个类(class)。开发者需要了解这些类之间的关系以及它们是如何协同工作的。 - **关键技术点**: - **图形渲染**:游戏中的图形...

    fizzbuzz:Java FizzBu​​zz

    在这个名为"fizzbuzz:Java FizzBu​​zz"的项目中,存储库包含了多种不同的Java实现方式,供面试者参考或用于教学目的。 首先,我们来看FizzBuzz问题的基本逻辑。可以使用一个for循环遍历1到指定数字,然后通过if和...

    中医大夫助理信息系统 zz-doctor

    《中医大夫助理信息系统 zz-doctor 深度解析》 中医大夫助理信息系统“zz-doctor”是一款基于Android平台的应用程序,旨在为中医医生提供智能化、便捷化的诊疗辅助工具。通过深入剖析这款应用的源码,我们可以了解...

    超出NLO QCD的高横向动量的ZZ产生

    我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...

Global site tag (gtag.js) - Google Analytics