类装载机制的类的初始化顺序

1.通过子类来调用父类的静态字段,只会触发父类的初始化,但是这是要看不同的虚拟机的不同实现。

2.每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。

3.对JVM采用的双亲委派类加载机制

4.Java的连接模型允许用户运行时扩展引用程序

你的程序可以装载在编译时并不知道或者尚未存在的类或者接口,并动态连接它们并进行有选择的解析。
  运行时动态扩展java应用程序有如下两个途径:

5.

3.1 调用java.lang.Class.forName(…)加载类

  这个方法其实在前面已经讨论过,在后面的问题2解答中说明了该方法调用会触发哪个类加载器开始加载任务。这里需要说明的是多参数版本的forName(…)方法:

  1. public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException

  这里的initialize参数是很重要的。它表示在加载同时是否完成初始化的工作(说明:单参数版本的forName方法默认是完成初始化的)。有些场景下需要将initialize设置为true来强制加载同时完成初始化。例如典型的就是利用DriverManager进行JDBC驱动程序类注册的问题。因为每一个JDBC驱动程序类的静态初始化方法都用DriverManager注册驱动程序,这样才能被应用程序使用。这就要求驱动程序类必须被初始化,而不单单被加载。Class.forName的一个很常见的用法就是在加载数据库驱动的时候。如 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance()用来加载 Apache Derby 数据库的驱动。

时间: 2024-11-04 08:44:48

类装载机制的类的初始化顺序的相关文章

jvm类装载机制

1.Class.forName("org.whatisjava.reflect.Foo")首先会将reflection.Foo类装入JVM,并 返回与之关联的Class对象.JVM装入Foo类后对其进行初始化,调用了其static块中的代码. 2.类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性.. 一.简单过程 Java程序运

【转】JVM类装载机制的解析,热更新的探讨(二)

同样,一个Class对象必须知道自己的超类.超级接口.因此,Class对象会引用自己的超类和超级接口的Class对象.这种引用一定是实例引用.(实际上,超类.超级接口的引用也存储在常量池中,但为了区分依赖类的引用,将它特殊表述一下.) 因此,我暂且得到两条结论. 结论一:持有一个Class对象的引用,则任何该Class对象直接或间接依赖的所有类(如果被加载了),都不可能被卸载.同样,只要有一个类直接或间接依赖某个类,则该类不可能被卸载. 结论二:持有一个Class对象的引用,则该类的所有超类.超

jvm的类加载器,类装载过程

混沌初开,在一片名为jvm的世界中,到处都是一片虚无,直到一个名为BootstrapClassLoader的巨人劈开了世界,据说它是由名叫C++的女神所造,它从一个叫做jre/lib的宝袋中拿出一把开天之斧ExtensionClassLoader,以及其他各种各样五颜六色的宝物,这些宝物撒落在混沌世界中,化作了山山水水.紧接着,巨人又使用ExtensionClassLoader这把巨斧劈开了一个叫做jre/lib/ext的巨峰,那里瞬间迸发出了五颜六色的彩芒,彩芒四溅而去,让这个灰色的世界不再那

C++成员初始化顺序

#include <iostream> using namespace std; int seti() {cout << "seti" << endl;return 1;} int setj() {cout << "setj" << endl;return 1;} class a { public: a() {cout << "a()~~~~~" << endl;

初始化和类装载

由于 Java 中的一切东西都是对象,所以许多活动变得更加简单,这个问题便是其中的一例.Java中每个对象的代码都存在于独立的文件中.除非真的需要代码,否则那个文件是不会载入的.通常,我们可认为除非那个类的一个对象构造完毕,否则代码不会真的载入.装载的时候,所有static对象和 static代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序).当然,static 数据只会初始化一次. 1.继承初始化 我们有必要对整个初始化过程有所认识,其中包括继承,对这个过程中发生的事情有一个整

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java 类中成员初始化顺序

Java 中的类成员 基本分为 静态成员, 实例变量  方法中特别的是静态方法和构造方法. 1.定义一个类 public class ClassLoaderTest { public int a ; public String b; private static int c; public  ClassLoaderTest(){ System.out.println("执行前:"+ a + "  "+ b); a = 10; b = "lisi"

Java类、实例的初始化顺序

题目: public class InitTest{ public static int k = 0; public static InitTest t1 = new InitTest("t1"); public static InitTest t2 = new InitTest("t2"); public static int i = print("i"); public static int n = 99; public int j = pr

Java中的类装载和初始化模块

在Java中,初始化模块是指用一对"{}"括起来的代码,可以与构造方法一起来对对象进行初始化.初始化模块又分为实例初始化模块和静态初始化模块(只能由类的静态成员引用,在类装载时进行调用) Java中,代码的执行顺序是: 1.装入类     1.1递归装入父类,直到继承链上的父类全部装入为止.     1.2类装入内存之后,静态数据域和静态初始块按照在类中出现的顺序进行执行. 2.调用类的构造方法     2.1递归调用父类的构造方法,直到父类为java.lang.Object为止.