`
剑&箫
  • 浏览: 53158 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java动态加载小结

    博客分类:
  • Java
阅读更多

    上一节课老师讲了java类的动态装载与反射,上课时听的稀里糊涂的,课后自己找了《深入java虚拟机》看了相关的内容,今晚就大概的总结一下吧,或者说是在写读书笔记。

    平时在编写并运行java程序时,就体验到相关的java技术。首先是编译器把源程序编译成java class文件,然后在java虚拟机中运行class文件。要想深刻的理解java类的动态加载与反射,首先是要理解java虚拟机的体系结构。下面是java虚拟机的体系结构图:

 

   从图中可以看出Java虚拟机运行一个程序时,首先是通过类装载器来装载class文件的,然后从已装载的class文件中得到类的相关信息,如程序创建的对象,传递给方法的参数,返回值,局部变量等,java虚拟机将这些东西存储到运行时数据区进行管理的。

类装载器:java虚拟机中有两种类装载器:1.启动类装载器,2.用户自定义装载器。启动类装载器是java虚拟机实现的一部分,而用户自定义类装载器是普通的java对象,它的类必须派生自java.lang.ClassLoader类,ClassLoader类中定义的方法为程序提供了访问类装载器机制的接口,从ClassLoader类的源代码中可以看出主要是通过以下四个方法通向Java虚拟机的。

protected final Class<?> defineClass(String name, byte[] b, int off, int len)
	throws ClassFormatError
    {
	return defineClass(name, b, off, len, null);
    }

 

protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)throws ClassFormatError
    {
         return defineClassCond(name, b, off, len, protectionDomain, true);
    }

 

protected final void resolveClass(Class<?> c) {
	resolveClass0(c);
    }
protected final Class<?> findSystemClass(String name)
	throws ClassNotFoundException
    {
	ClassLoader system = getSystemClassLoader();
	if (system == null) {
	    if (!checkName(name))
		throw new ClassNotFoundException(name);
            Class cls = findBootstrapClass(name);
            if (cls == null) {
                throw new ClassNotFoundException(name);
            } 
	    return cls;
	}
	return system.loadClass(name);
    }

  

两个重载的defineClass方法能够把新的类或者接口导入到方法区中,findSystemClass方法通过启动类装载器来装载指定类型,resolveClass方法能够让装载器执行连接动作。此外,对于每一个被装载的类或者接口,java虚拟机都会为它创建一个java.lang.Class的实例来代表该类或者接口。用户自定义的类装载器以及Class类的实例都放在堆中,而装载的类或者接口则放在方法区中。

方法区:在java虚拟机中被装载的类或者接口的信息存储在逻辑上称为方法区的内存中,虚拟机会在方法区中存储以下类或者接口的信息:

1.这个类或者接口的权限定名。

2.这个类或者接口的直接超类的权限定名,除非java.lang.Object类。

3.这个类或者接口的的标识,即是类还是接口。

4.这个类或者接口的访问修饰符。

5.任何直接超接口的权限定名的有序列表。

6.该类或者接口的常量池。

7.字段信息。

8.方法信息。

9.除了常量以外的所有类变量。
10.一个到ClassLoader类的引用。

11.一个到Class类的引用。

:java程序在运行时创建的所有类的实例或数组都放在同一个堆中。在一个java虚拟机实例中,只存在一个堆空间,因此所有线程都共享这个堆,在这种情况下就要考虑多线程访问对象的同步问题了。

Java栈:每当启动一个线程时,虚拟机都会为它分配一个Java栈,虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

从以上的的表述中大概了解了java虚拟机的体系结构,下面大概总结下虚拟机的工作过程:

    java虚拟机通过装载、连接、初始化一个java类或者接口,使得可以被正在运行的java程序所使用。其中,装载是把class文件读入虚拟机中,连接是把已读入虚拟机中的数据类型合并到虚拟机的运行时状态中去,连接分为三个阶段:验证、准备和解析,验证是确保java类型数据格式正确并使用于虚拟机,准备则是负责为该类型(类或者接口)分配所需的内存空间,解析是把常量池中的符号引用转换为直接引用。初始化是将类变量赋以适当的初始值。

装载阶段是由三个基本动作组成:

1.通过该类型的完全限定名,产生一个代表该类型的二进制数据流。

2.解析这个二进制数据流为方法区内的内部数据结构。

3.创建一个表示该类型的java.lang.Class类的实例。

总结:装载的最终产品是Class类的实例对象,它成为Java程序与内部数据结构之间的接口。
初始化包含两个步骤:

1.如果类存在直接超类,且直接超类还没有被初始化,就先初始化直接超类。

2.如果类存在一个类的初始化方法,就执行此方法。

一旦一个类被装载、连接和初始化,它就可以随时使用了,程序可以访问它的静态变量,调用它的静态方法,或者创建它的实例,在java程序中可以明确的使用new;或者调用Class或者java.lang.reflect.Constructor对象的newInstance()方法;或者调用现有对象的Clone()方法来创建对象。

java程序通过传递类型的名字到java.lang.Class的forName()的方法或者用户自定义的类装载器的loadClass()方法可以在运行时决定加载哪一个类型并使用它们。

好了,先写到这里吧,总结的很粗糙,以后有深入的理解再总结吧。

  • 大小: 12.8 KB
0
0
分享到:
评论

相关推荐

    Java爬虫Jsoup+httpclient获取动态生成的数据

    主要介绍了Java爬虫Jsoup+httpclient获取动态生成的数据的相关资料,需要的朋友可以参考下

    基于java的商品信息管理系统--大学本科Java基础

    2、学生可自行添加完善功能。3、界面美观得体,(1)登陆界面醒目,标题清晰。(2)无乱码,错别字。(3)使用my eclipse /Eclipse编写程序4、程序编码时,必须严格遵守java程序标识符的一般约定,并要加适量的注释...

    Java数据编程指南

    数据定义 基本数据操作 数据完整性 表达式 连接 合并 ...Java 小结 附录D 配置Tomcat、JRun和Orion Tomcat安装和配置 JRun 3.0安装和配置 安装检索 附录E 在WebLogic 6.0上配置并...

    Java服务器程序设计

    用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系...15.6 小结[/font]

    疯狂JAVA讲义

    1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...

    Java学习代码实例 JAVA基础,JAVA面向对象,JAVA高级.rar

    JAVA命令-&gt;要使用一个*.class文件(类文件)-&gt;通过classpath找到*.class文件所保存的真实目录,之后再进行加载执行 小结 Path的主要功能是设置JDK的可执行命令 classpath主要是在执行时候起作用,告诉JVM类的保存路径...

    java范例开发大全源代码

     实例167 继承关系的加载顺序 266  实例168 如何访问同名的方法或变量 268  实例169 super()方法的使用 271  实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机...

    Java典型模块

    1.4 小结 第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    虚拟机堆转储快照分析工具 / 84 4.2.6 jstack:Java堆栈跟踪工具 / 85 4.3 JDK的可视化工具 / 87 4.3.1 JConsole:Java监视与管理控制台 / 88 4.3.2 VisualVM:多合一故障处理工具 / 96 4.4 本章小结 / 105 第5...

    Java Web程序设计教程

    &lt;&lt;Java Web程序设计教程.pdf&gt;&gt;人民邮电出版社的教程哦,所以,好书,你懂的!! 第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 ...本章小结 342

    21天学通Java-由浅入深

    28 1.3 程序开发过程 29 1.4 编码规范 29 1.5 HelloWorld:第一个Java程序 30 1.5.1 编写程序代码 30 1.5.2 编译程序代码并运行 30 1.5.3 注意事项 31 1.6 使用Eclipse集成开发工具开发 32 1.7 综合练习 32 1.8 小结 ...

    Java 2平台安全技术-结构,API设计和实现

    3.12 小结 67 第4章 安全结构的使用 70 4.1 安装JDK1.2 70 4.2 策略配置 71 4.2.1 配置系统型和用户专用型策略 71 4.2.2 配置应用程序专用型策略 72 4.2.3 配置一个可选Policy类的实现 72 4.2.4 缺省的策略文件格式 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    2.10 本章小结 116 第3章 深入使用JSF 117 3.1 JSF事件机制 118 3.1.1 Java事件模型概述 118 3.1.2 Java事件模型示例 119 3.1.3 JSF事件模型 120 3.1.4 Action事件 122 3.1.5 值改变事件 125 3.1.6 生命周期事件 128...

    Java虚拟机

    1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行...

    ROS机器人学习小结.docx

    ROS机器人学习小结全文共9页,当前为第1页。ROS机器人学习小结全文共9页,当前为第1页。ROS机器人学习小结 ROS机器人学习小结全文共9页,当前为第1页。 ROS机器人学习小结全文共9页,当前为第1页。 Ros简介 ROS是一...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    基于Java的京东电商系统的设计与实现.docx

    3.3 系统界面设计 13 3.4 本章小结 13 第4章 系统实现 14 4.1 系统框架实现 14 4.2 网站商品管理模块实现 15 4.2.1 商品添加 15 4.2.2 商品查询 16 4.3 网站内容管理模块实现 16 4.3.1 首页内容新增 16 4.3.2 首页...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.11 小结 36 第2章 xml名称空间 38 2.1 声明名称空间 38 2.2 名称空间在元素和属性中的运用 39 2.2.1 名称空间在元素中的运用 39 2.2.2 默认名称空间 41 2.2.3 名称空间在属性中的运用 42 2.3 名称空间和dtd...

Global site tag (gtag.js) - Google Analytics