[list]
通过直接调用构造函数:
Backkom instance1=new Backkom();
如果当前ClassLoader无法找到Backkom类,抛出NoClassDefFoundError。
反射机制1:
Class clazz = Class.forName("Backkom");
Object instance2 =clazz.newInstance();
如果无法找到Backkom,抛出ClassNotFoundException。
反射机制2:
Class clazz = classLoader.loadClass("Backkom");
Object instance2 =clazz.newInstance();
如果无法找到Backkom,抛出ClassNotFoundException。
[/list]
方法1和方法2是从当前的ClassLoader中去加载,方法3是从用户指定的ClassLoader中加载。方法2和方法3在初始化变量时的一个显著不同是:使用方法2,类的静态变量和静态化初始块在执行Class.forName()时执行;使用方法3,类的静态变量和静态初始块在执行Class.newInstance()时执行。
JLS中给出的Java类对象初始化顺序定义如下:
- Assign the arguments for the constructor to newly created parameter variables for this constructor invocation.
- If this constructor begins with an explicit constructor invocation of another constructor in the same class (using this), then evaluate the arguments and process that constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason; otherwise, continue with step 5.
- This constructor does not begin with an explicit constructor invocation of another constructor in the same class (using this). If this constructor is for a class other than Object, then this constructor will begin with an explicit or implicit invocation of a superclass constructor (using super). Evaluate the arguments and process that superclass constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, continue with step 4.
- Execute the instance initializers and instance variable initializers for this class, assigning the values of instance variable initializers to the corresponding instance variables, in the left-to-right order in which they appear textually in the source code for the class. If execution of any of these initializers results in an exception, then no further initializers are processed and this procedure completes abruptly with that same exception. Otherwise, continue with step 5. (In some early implementations, the compiler incorrectly omitted the code to initialize a field if the field initializer expression was a constant expression whose value was equal to the default initialization value for its type.)
- Execute the rest of the body of this constructor. If that execution completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, this procedure completes normally.
对类对象初始化顺序的部分解释如下:
- 为类分配内存空间,初始化所有成员变量为默认值,包括primitive类型(int=0,boolean=false,…)和Reference类型。
- 如继承与某个父类,调用父类的默认构造函数
- 调用当前类的默认构造函数
类对象初始化时需要特别注意:
成员变量初始化是在父类构造函数调用完后,在此之前,成员变量的值均是默认值。故在构造函数中尽量不要加入复杂的业务逻辑,亦可凡是不使用复杂的继承关系,从而减少怪异问题的出现。
分享到:
相关推荐
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
Java虚拟机JVM类加载初始化是Java程序运行过程中的关键环节,它负责将类的字节码文件加载到内存中并进行相应的处理,以便程序能够正确执行。在Java中,类加载器(Classloader)扮演着核心角色。下面将详细讨论类加载...
4. **初始化**:如果类还没有被初始化,那么会执行类的初始化方法(),这通常涉及到静态变量的初始化和静态块的执行。 Java允许用户自定义ClassLoader,这在某些场景下非常有用,比如动态加载插件或者实现热更新。...
Java虚拟机(JVM)是Java程序运行的核心,它的内部机制包括了类的加载、链接、初始化等关键过程。在Java编程中,了解这些过程对于优化程序性能、理解和解决类加载问题至关重要。本文将深入探讨Java虚拟机中的类初始...
在初始化阶段,类的静态变量会被赋予正确的初始值,例如`public static int num=3;`在连接的准备阶段值为0,初始化阶段变为3。 **知识点5:初始化的静态变量** 初始化阶段只处理静态变量,不涉及实例变量,因为此时...
Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...
ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解ClassLoader的工作原理对于优化Java应用程序性能以及解决类冲突等问题具有重要意义。 一、ClassLoader的基本概念 Java程序由多个类组成,...
在初始化阶段,类加载器会对加载的类进行初始化,包括静态变量的初始化和 static 块的执行。 Java 的类加载器机制是 JVM 运行过程中的核心组件,负责加载和管理 Java 类。理解类加载器的工作原理可以帮助开发者更好...
2. 静态初始化器问题:多个类加载器加载同一类,可能导致静态初始化器被执行多次,需要谨慎处理类的加载关系。 3. 类循环依赖:类之间相互引用可能导致加载延迟,合理设计类结构和加载顺序可避免此类问题。 综上所...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...
### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...
4. **处理资源**:自定义ClassLoader还需要处理类的加载顺序、缓存策略等问题。 #### 六、实战案例分析 以淘宝网为例,淘宝作为一个大型电子商务平台,面临着频繁的代码更新和部署。为了提高系统的灵活性和可用性...
1. 类加载过程:Java中的类加载分为三个阶段——加载、验证、准备、解析和初始化。ClassLoader主要参与的是加载阶段,它从磁盘、网络或其他数据源读取字节码文件,并将其转换为Class对象。 2. 类加载器层次结构:...
破解java加密的ClassLoader.java,在classloader植入破解代码
- **链接和初始化类**:加载完成后,ClassLoader还需要完成类的链接和初始化操作,使类可以在程序中使用。 **3. 类加载器的层次结构** Java中的ClassLoader分为几种类型,形成了一个层次结构: - **Bootstrap ...