`
剑&箫
  • 浏览: 53558 次
  • 性别: 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调用RMI小结

    RMI(Remote Method Invocation,远程方法调用)是Java平台中用于分布式计算的一种技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法,从而实现跨网络的通信。Java RMI 提供了一种透明的...

    Java类与对象小结

    这篇小结将深入探讨这两个关键概念,以及它们在实际编程中的应用。 首先,类是Java中的蓝图,它定义了一组特性和行为,这些特性和行为共同构成一个特定实体。类可以包含字段(或称为属性),它们代表对象的状态,...

    java基础小结

    理解类的加载、编译和运行过程有助于深入学习Java。 8. **工具实践**:理解并掌握如何使用JDK工具,如Javac编译器、Javadoc生成API文档、JAR打包工具等,能提高开发效率。 总之,Java基础涵盖了许多方面,从简单的...

    java基础知识从业必备知识点结构图小结.rar

    为了全面理解Java基础知识,本小结将按照给定的文件名,逐一解析关键知识点。 1. **Java基础知识** 这一部分通常包括Java语言的基础语法,如变量、数据类型、运算符、流程控制(if语句、switch、for、while循环等...

    Java学习事件机制小结

    如果登录验证通过,可能跳转到新的界面或者加载用户信息;若验证失败,则显示错误信息。 此外,为了提高代码可读性和可维护性,通常会使用匿名内部类来创建监听器。Java 8引入了Lambda表达式,可以更简洁地编写监听...

    Java中类的继承学习小结

    下面是对"Java中类的继承学习小结"的详细讲解。 首先,类的继承使用关键字`extends`来实现。子类(也称为派生类)声明时,会指定一个父类(或超类): ```java public class DerivedClass extends BaseClass { //...

    java调用存储过程小结.pdf

    Java 调用存储过程小结 Java 调用存储过程是指在 Java 程序中调用数据库中的存储过程,以便实现复杂的业务逻辑和数据处理。存储过程是指保存在数据库并在数据库端执行的程序,可以使用特殊的语法在 Java 类中调用...

    Java图形组件Swing小结

    Java Swing是Java AWT(Abstract Window Toolkit)的扩展,提供了更为丰富的用户界面组件,使得开发者可以构建出功能强大且美观的图形用户界面。本篇将深入探讨Java Swing中的关键组件和设计模式,以及如何利用它们...

    java 实现音乐播放器资料总结

    在Java中,可以为UI组件添加ActionListener或其他类型的监听器,实现相应的回调方法来响应用户的操作。 5. **多线程**:为了保证音乐播放的流畅性,通常会在单独的线程中进行音频播放。这样,即使UI线程被其他操作...

    java学习小总结——画图板制作(附代码)

    本篇小结将聚焦于如何使用Java实现一个基本的画图板,同时提供相关的源码分析。 1. Java GUI基础 Java提供了丰富的类库用于创建GUI,主要在java.awt和javax.swing包下。在这个项目中,我们可能会使用`JFrame`作为主...

    java试题小结可以下载的

    【Java试题小结】 1. **Applet生命周期与方法**: - 在Java中,Applet的生命周期包括初始化、启动、绘画、停止和销毁几个阶段。`init()`方法用于初始化Applet所需资源,`paint()`方法负责在屏幕上绘制图形,如线条...

    java链表 个人总结

    ArrayList基于动态数组,适合随机访问和索引操作,而LinkedList则更适合进行插入和删除操作,因为它的遍历速度更快。LinkedList实现了Deque(双端队列)和List接口,支持在两端添加、删除元素。 在Java中,...

    Java调用Delphi开发的Dll小结[归类].pdf

    本文主要讨论了两种方法,使得Java应用程序能够调用由Delphi开发的DLL动态链接库。这两种方法分别是:通过JNI(Java Native Interface)和使用JNA(Java Native Access)第三方组件。 1. **JNI调用Delphi开发的DLL*...

    java的基础性小结与笔记

    虚拟目录映射有三种方式:在`server.xml`中添加`Context`元素(重启服务器)、在`Conf/catalina/主机目录/aa.xml`中添加(无须重启)或直接将应用发布到`webapps`目录下。每个`Context`元素代表一个Web应用,并可以...

    java String类常用方法练习小结

    所有改变字符串的操作(如添加字符、删除字符等)都会返回一个新的`String`对象,而原始对象保持不变。 ### 5. 常见面试题 - **`"abc".equals("abc")` 与 `"abc" == "abc"` 的区别是什么?** - `equals()` 比较的...

    java.util.vector中vector小结

    在Java编程语言中,`java.util.Vector`是一个重要的集合类,它是`ArrayList`的早期版本,提供了线程安全的动态数组实现。这篇文章将对`Vector`类进行详细的总结,包括其特点、用法以及与`ArrayList`的区别。 1. **...

    Java调用Delphi开发的Dll小结.pdf

    在Java开发中,有时需要调用由其他编程语言如Delphi编写的DLL动态链接库。本文将详细讲解两种方法,使得Java能够与Delphi开发的DLL进行交互。 1. 通过JNI(Java Native Interface)调用Delphi DLL: JNI是一种让...

    Java内存分配、管理小结.doc

    - 反射是Java提供的一种动态类型机制,允许程序在运行时检查类的信息,如方法、字段和构造函数,并能够动态地创建和访问对象。 - 类在加载时,其信息存储在方法区,通过`Class`对象可以获取这些信息,进而实现反射...

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

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

Global site tag (gtag.js) - Google Analytics