深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

深入理解Java虚拟机——JVM类加载机制(类加载过程和类加载器) 一、什么是类加载机制?虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。二、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准(Preparation)、解析(Resolution)、初始化(Initial 阅读详情

目录

Java类加载机制

类加载过程

加载(Loading)

连接(Linking)

初始化(Initialzation)

使用(Useing)

卸载(Unloading)


引言

  1. 什么情况下开始类加载过程的第一个阶段:加载?
    1. 答:Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现去自由把握。但是对于初始化阶段,虚拟机则是严格规定了有且只有5种情况必须立即对类进行“初始化”,而加载、验证、准备这几个过程自然需要在此之前进行。
  2. 类的实例化过程详细执行情况到底是怎样???
  3. 虚拟机何时、如何加载Class文件,Class文件信息进入虚拟机会发生什么变化?
  4. 什么是符号引用与直接引用???
  5. 什么是初始化??
  6. 接口与类在初始化有什么区别??
  7. 类构造器<clinit>()方法与实例构造器<init>()方法的区别??

本文重点

  • 类的实例过程详解

  • 类的初始化条件

欲知详情,还请细看本文


  • 类的生命周期

一 加载(Loading)

  1. 加载的内容

    1. 通过一个类的全限定名来获取定义此类的二进制字节流,具体由哪些呢?

      1. 从zip包中读取,最终成为JAR,EAR,WAR格式的基础

      2. 从网络中获取,典型应用Applet

      3. 运行时计算生成,动态代理技术

      4. 由其他文件生成,典型场景Jsp应用,由jsp文件生成对应的class类

      5. 从数据库中读取,场景较少,如:有些中间件服务器(SAP Netweaver)可以选择把程序安装到数据库中完成程序代码在集群建分发

    2. 将这个字节流所代表的静态结构转化为方法区的运行时数据结构

    3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口


二 连接(Linking)

  1. 验证(Verification)

    1. 文件格式验证的内容有哪些?
      1. 是否以魔数CAFFBABE开头
      2. 主次版本号是够处于虚拟机处理范围之内
      3. 常量池中常量是否有不被支持的常量类型
      4. 指向常量的各种索引值是否指向不存在的常量或不符合类型的常量
      5. CONSTANT_Utf8_info型常量是否有不符合UTF8编码的数据等等
    2. 元数据验证的内容有哪些?
      1. 该类是否有父类
      2. 该类的父类是否继承了不允许继承的类(final类)
      3. 如果该类不是抽象类,是否实现了父类中或抽象接口中要求实现的所有方法
      4. 类中的字段是否与父类发生矛盾,如:覆盖了父类的final字段 不符合规则的方法重载
    3. 字节码验证的内容有哪些?
      1. 保证跳转指令不会跳转到方法体以外的字节码指令上
      2. 保证方法体汇中的类型转换是否有效
      3. 保证任意时刻操作数栈中的数据类型与指令代码序列都能配合工作
    4. 符号引用验证
      1. 目的:确保解析动作能正常执行
      2. 内容有哪些?
        1. 符号引用中通过字符串描述的全限定名是否能找到相应的类
        2. 符号引用中的类、字段、方法的访问性是否可以被当前类访问
        3. 在指定类中存在符合方法的字段描述以及简单名称和字段
  2. 准备(Prepareing)

    1. 准备阶段是正式为类变量分配内存并设置类变量(static修饰的变量)初始值的阶段,初始值在通常情况下为数据类型的“零值”
    2. 零值
      1. 整形的零值为: 0
      2. 布尔n类型的零值为: false
      3. 引用类型的零值为: null
    3. 假设一个类变量的定义为:public static int value=1234;那变量value在准备阶段过后的值不是为1234,而是0.只有经历了初始化阶段之后value的值才会为1234。
  3. 解析(Resolution)

解析过程是虚拟机将常量池内的符号引用替换为直接引用的过程。

  1.  
    1. 预备知识
      1. 什么是符号引用与直接引用???
      2. 符号引用(编译原理方面的概念)包括下面三类常量
        1. 类和接口的全限定名
        2. 字段的名称和描述符
        3. 方法的名称和描述符
      3. 直接引用的定义
        1. 直接指向目标的指针
        2. 相对偏移量
        3. 间接定位到目标的句柄
    2. 解析的内容包括哪些?
      1. 类或接口
      2. 字段
      3. 类方法
      4. 接口方法
      5. 方法类型
      6. 方法句柄
      7. 调用点限定符

 

三 初始化(Initialzation)

  1. 预备知识
    1. 什么是初始化?
      1. 即执行类构造器<clinit>()方法的过程。类加载过程最后一步,前面的过程完全由虚拟机主导和控制(除了通过自定义加载器参与外),初始化阶段才真正开始执行类中定义的Java代码(或者说是字节码)。

    2. 执行类构造器<clinit>()方法的过程是什么?

      1. <clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块(Static{}块)中的的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在静态语句块可以赋值,但是不能访问。
      2. <clinit>()方法对于类和接口不是必需的,如果没有static修饰的方法、代码块、变量。编译器可以不为其生成<clinit>方法
    3. 接口与类在初始化有什么区别?
      1. 只有该真正使用父接口的时候才会初始化,如:引用父接口中定义的常量
    4. 类构造器<clinit>()方法与实例构造器<init>()方法的区别?
      1. 无需显式的调用父类构造器,虚拟机会保证在子类<clinit>()方法执行前,父类的<clinit>方法已经执行完。
      2. 因此意味着虚拟机中第一个执行<clinit>()方法的肯定是java.lang.Object,父类中定义的静态语句块先于子类的变量赋值操作
  2. 初始化的条件
    1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时。
    2.  使用java.lang.reflect包对类进行反射调用时,如果类没有进行初始化,则需要先触发其进行初始化
    3. 初始化一个类时,如果其父类还没有进行初始化,则需先触发其父类进行初始化
    4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的),虚拟机会先初始化这个主类、
    5. 如果java.lang.invoke.MethodHandle实例最后的解析结果是REF_getstatic的句柄、REF_putstatic的句柄、REF_invokestatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需先触发其初始化。

 

  1. 不会触发初始化的情况,被动引用,后文举了三个例子。

     

    1. 子类引用父类的静态字段,对于静态字段,只有直接定义这个字段的类才会初始化。
    2. 引用其他类的常量字段,不会触发此类初始化,编译阶段,常量传播优化。
    3. 通过数组定义来引用类,不会触发此类初始化

实例代码演示


演示一:类的实例创建过程:  

预备知识

  • 初始化的含义:

执行类构造器<clinit>()方法,即为类变量赋值+执行静态语句块 static{}的过程。

  • 为什么在实例化子类的对象时,会先调用父类的构造器?

答:子类继承父类后,获取到父类的属性和方法,这些属性和方法在使用前必须先初始化,所以须先调用父类的构造器进行初始化

  • 如何调用父类的构造器?

在子类构造器的第一行会隐式的调用 super();,即调用父类的构造器, 如果父类中没有定义空参的构造器,则必须在子类的构造器的第一行显示的调用super(参数); ,以调用父类中构造器, 如果子类中构造器的第一行写了this();,则就隐式的super();会消失,因为super()和this()都只能在构造器的第一行定义


class  C{
	C() {
        System.out.println("正执行SuperClass类的构造方法对成员变量初始化,为其成员变量C分配内存空间");
    }

}

class SuperClass {
    C c = new C();
	static{
	System.out.println("SuperClass类 正在初始化");
}
	
	SuperClass() {
        this("正在调用SuperClass的有参构造方法");
        System.out.println("正在执行SuperClass的无参构造方法");
    }
 
	SuperClass(String s) {
        System.out.println(s);
    }
}

public class SubClass extends SuperClass{
	static{
	System.out.println("SubClass类 正在初始化");
}
	SubClass() {
        /*在子类构造方法的第一句,隐式的调用父类的构造方法;*/
        System.out.println("正在执行子类SubClass的构造方法");
    }
	 public static void main(String[] args) {
	        new SubClass();
	    }
}

 

 

类的实例过程

  1. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的),虚拟机会先初始化这个主类。即SubClass类
  2. 初始化一个类时,如果其父类还没有进行初始化,则需先触发其父类进行初始化。即需先初始化SubClass类的父类SuperClass。
  3. 由于父类没有显式的继承一个类,虚拟机默认其继承所有类的祖先类即java.lang.Objec类。即需对Object类进行初始化。总而言之,虚拟机中第一个执行<clinit>()方法的肯定是java.lang.Object,父类中定义的静态语句块和类的变量赋值操作都要先于子类。
  4. 初始化SubClass类的父类SuperClass,输出“SuperClass类 正在初始化”
  5. 初始化父类SuperClass的子类SubClasst,输出“SubClass类 正在初始化”
  6. 执行SubClasst类的静态语句块时,遇到new关键字,调用子类的构造方法,子类构造器的第一行会隐式的调用 super();,即先调用父类的构造方法。
  7. 调用父类的构造方法,为类中的成员变量分配内存,执行构造方法中的语句。
    1. 即先输出“正执行SuperClass类的构造方法对成员变量初始化,为其成员变量C分配内存空间,成员变量赋值先于构造方法中的语句”
    2. 再输出“正在执行SuperClass的无参构造方法中的语句”
  8. 调用子类的构造方法,为类中的成员变量分配内存,执行构造方法中的语句。输出“正在执行子类SubClass的无参构造方法中的语句”

 

  • 被动引用演示一 子类引用父类的静态字段,对于静态字段,只有直接定义这个字段的类才会初始化。

package negtive_reference;
/*
 * 被动使用字段演示一
      通过子类引用父类的静态字段,不会导致子类初始化
*/

public class SuperClass {
	static{
	System.out.println("SuperClass Init");
}
	public static int value=123;

}

package negtive_reference;

public class SubClass extends SuperClass{
	static{
		System.out.println("SubClass Init");
	}
}

package negtive_reference;

public class NotInitialization {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(SubClass.value);
	}

}

输出内容  :

 


  • 被动引用演示二 引用其他类的常量字段,不会触发此类初始化,编译阶段,常量传播优化。

 

package negtive_reference;
	/*常量在编译阶段会调入类的常量池,
	 *本质上并没有直接引用到定义常量的表,
	 *因此不会触发定义常量的类的初始化*/
public class ConstantClass {
	static{
	System.out.println("ConstantClass Init");
}
	public static final String HELLOWOELD="hello world";
}
package negtive_reference;

public class NotInitialization {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*System.out.println(SubClass.value);*/
		/*SuperClass[] sca= new SuperClass[10];*/
		System.out.println(ConstantClass.HELLOWOELD);
	}

}

 输出:无输出

 

  • 被动引用演示三 通过数组定义来引用类,不会触发此类初始化

package negtive_reference;
/*
 * 被动使用字段演示一
      通过数组来引用类,不会触发此类的初始化
*/

public class SuperClass {
	static{
	System.out.println("SuperClass Init");
}
	public static int value=123;

}



package negtive_reference;

public class NotInitialization {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SuperClass[] sca= new SuperClass[10];
	}

}

输出:无输出

总结:有三个可以给变量赋值的阶段

  • 准备阶段,为类变量设置初始值,即赋予其对应数据类型的“零值”。
  • 初始化阶段,为类变量赋予用户在程序中声明的值。前文中将value赋值为1234
  • 类创建实例时,执行其构造方法init()时,如果成员变量声明时没有指定初值,所使用的构造方法也没有对成员变量进行初始化操作,会为成员变量赋予其相应数据类型的“零值”。

注意:前面两个阶段针对的是类变量,即static关键字修饰的变量,前两个阶段不会对实例变量设置初始值。

觉得本文不错的话对你有帮助的可以点个赞哦!



 

Java类加载过程详解 Java是一种面向对象的编程语言,它的核心特性之一是动态类加载和运行时环境。在Java中,类加载是将类的字节码数据加载到内存中,并转换为可以执行的Java对象的过程。本文将详细介绍Java类加载的过程,并附上相应的源代码示例。通过以上的详细解释和示例代码,我们可以了解到Java类加载过程的各个阶段以及每个阶段的具体任务。类加载机制为Java提供了动态性和灵活性,使得开发人员可以在运行时加载和使用类,为应用程序提供了更大的灵活性和扩展性。 阅读详情

相关推荐

软件测试面试题汇总

软件测试面试题汇总 测试技术面试题 ........................................................................................................................................................................ 5 1、什么是兼容

晴天的专栏 2万+

java 虚类实例对象_你有认真了解过自己的“Java对象”吗?

作为一名 Javaer,生活中的我们可能暂时没有对象,但是工作中每天都会创建大量的 Java 对象,你有试着去了解下自己的“对象”吗?我们从四个方面重新认识下自己的“对象”创建对象的 6 种方式创建一个对象在 JVM 中都发生了什么对象在 JVM 中的内存布局对象的访问定位一、创建对象的方式使用 new 关键字这是创建一个对象最通用、常规的方法,同时也是最简单的方式。通过使用此方法,我们可以调用任...

weixin_34310322的博客 200

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 611

深入理解Java虚拟机之对象实例化篇

Java是面向对象的`静态强类型`语言,我们一般先声明并创建对象,根据某个类声明一个引用变量指向被创建的对象,并使用此引用变量操作该对象,如`Object obj = new Object()`,obj 即`引用变量`,也叫`实例成员变量`。下面通过简单地从执行步骤的角度来分析

潇歌的博客 302

FreeModbus从入门到实战:手把手教你用STM32实现工业级Modbus RTU通信

本文详细介绍了如何使用STM32和FreeModbus实现工业级Modbus RTU通信,涵盖硬件搭建、协议栈移植及优化技巧。重点解析了FreeModbus的移植过程,包括串口驱动适配、定时器配置和工业级稳定性优化,为开发者提供了一套完整的工业通信解决方案。

weixin_33737774的博客 347

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 908

一文读懂Java类加载全过程,面试必备!

Java类加载过程是Java虚拟机(JVM)将.class文件中的字节码装载到内存中,并对字节码进行验证、准备和初始化的过程。这个过程涉及到了Java虚拟机的类加载器、运行时数据区等多个方面,其中包含了很多的细节和技术问题。类加载器Java虚拟机的类加载过程是由类加载器(ClassLoader)来实现的。类加载器负责将类装载到内存中,并为其创建一个Class对象。

Hanko的专栏 1506

Mmdetection用自己的数据集训练Mask_RCNN

将自己数据的标签写入配置文件,在data前一行添加自己的标签列表,同时在train,val,test中添加classes = classes,如果不添加,模型就会默认读取coco原始数据集的80个标签,与自己的数据集对应不上就会报错。2.打开第二个文件coco_instance.py,将data_root路径改为你自己coco数据集的位置(注意一定要以/结尾),修改输出图片尺寸(根据自己的数据集决定)3.将标注完的数据转为Mask_rcnn训练所需的数据集格式。4.将数据集放到训练代码文件夹中。

m0_64298393的博客 3469

深入理解Java虚拟机——类加载机制

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来

SmallWinWin的博客 1552

【校招】SHL 的 General Ability (GA, 通用能力测试)

SHL 的 General Ability (GA, 通用能力测试) 文章目录SHL 的 General Ability (GA, 通用能力测试)1、归纳推理题1.1 圈圈线条推理1.2 图形颜色位置推理1.3 箭头指向推理2. 数字推理题攻略3. 语言推理题 1、归纳推理题   归纳推理题我把它总结为三种类型:圈圈线条推理;图形颜色位置推理;箭头指向推理。 1.1 圈圈线条推理   你别看这个题目看起来很复杂,其实很简单,而且这个题型的题目背后原理都一样!我把我的 tips 偷偷分享给你们嘿嘿~先从 A

Sunnyside_ 2万+

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 301

【深入理解Java虚拟机】类加载机制

本文内容来源于《深入理解Java虚拟机》一书,非常推荐大家去看一下这本书。本系列其他文章:【深入理解Java虚拟机】Java内存区域模型、对象创建过程、常见OOM【深入理解Java虚拟机】垃圾回收机制1、类加载机制概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在java中,类型的加载、连

开心阳 1万+

AI挖矿技术全景解析:从智能勘探到自主开采的2025年度技术演进与产业变革

随着全球关键矿产资源需求激增与开采难度加剧,人工智能(AI)技术正在重塑矿业全生命周期。本文系统综述了2025年AI挖矿技术的最新进展,涵盖从地质勘探、资源评估到自主开采、安全监控的完整技术链条。基于Elsevier 2025年发表的最新研究成果及IEEE会议前沿动态,本文深入分析了深度学习、强化学习、计算机视觉等核心技术在矿物识别、品位预测、设备维护等场景的应用机制。研究数据显示,AI技术已使勘探成功率提升45%,设备停机时间减少35%,整体运营效率提高40%以上。

nmdbbzcl的博客 2080

深入理解java虚拟机——类加载机制及双亲委派模型详解

深入理解java虚拟机——类加载机制 定义   类加载机制指的是:虚拟机将描述类的数据从class文件加载到内存中,对加载的数据进行验证,解析,初始化,最后得到虚拟机认可后转化为直接可以使用的java类型的过程   类加载机制一共有七个阶段:加载,验证,准备,解析,初始化,使用,卸载。其中的验证,准备,解析合称为连接阶段。   加载,验证,准备,初始化,卸载的顺序是确定是,另两个由动态绑定等情况可...

下雨了_简的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java虚拟机类加载机制详解

Java虚拟机的类加载机制是一个复杂且高效的过程,包括加载、验证、准备、解析和初始化等多个阶段。每个阶段都有严格的规范,确保程序在不同环境中稳定运行。理解类加载的时机、过程和类加载器的工作原理,有助于开发者更好地掌握JVM,优化应用程序的性能,解决类加载相关的问题。掌握双亲委派模型和类加载器的实现机制,对深入理解JVM和进行系统优化尤为重要。

dm菜鸟编程的专栏 994

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【虚拟机】深入理解java虚拟机【类加载机制】

java虚拟机【类加载机制】

xjavaxx的博客 1559

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入理解类加载机制

开始正文之前,我想先说一下写这些文章的目的和好处,主要是可以使自己对学习的东西做一个总结,有时候花费很长的时间学了一些东西,理顺了一些思路,可是过几天再回想这些东西的时候还会变得模糊,所有又要花费时间找相关资料,翻看资料。而现在自己做这样一个总结,不但可以对新学习的知识做一个巩固加

2万+

深入理解Java虚拟机的类加载机制

Java虚拟机的类加载机制是Java平台灵活性和可扩展性的关键所在。通过深入理解类加载的概念、过程、类加载器、双亲委派模型以及类的卸载与重加载,开发者可以更好地掌握Java程序的运行原理,并在必要时通过自定义类加载器和热部署等技术手段,实现高度灵活的应用架构。在Java虚拟机中,类的加载是指将class文件从硬盘读取到内存中,并创建对应的Class对象的过程。1. 使用自定义类加载器动态加载类。2. 自定义类加载器的实现与优化。3. 类的卸载与重加载策略。1. 系统提供的类加载器。四、类的卸载与重加载。

N201871643的博客 762

Java类加载机制详解

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制

怪咖@的博客 2503

JVM类加载机制详解——类加载过程

代码编译的结果从本地机器码转变为字节码, 是存储格式发展的一小步, 却是编程语言发展的一大步 ----《深入理解Java虚拟机:JVM高级特性与最佳实践》 一、知识铺垫         Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、 转换解析和初始化, 最终形成可以被虚拟机直接使用的Java类型, 这个过程被称作虚拟机的类加载机制。 Class文件被加载到内存中是如何存储的?就要涉及到JVM的K.

jb84006的博客 2061

《深入理解 Java 虚拟机:类加载机制》

重要性程序运行基础:类加载是Java程序运行的第一步,它负责将类的字节码加载到内存中,并进行验证、准备和初始化等操作,为程序的执行做好准备。动态性支持:Java语言的动态性很大程度上依赖于类加载机制,通过类加载机制,Java程序可以在运行时动态地加载类、解析类和初始化类,从而实现程序的动态扩展和灵活性。相关概念类与类加载器:每个类都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,类加载器负责将类的字节码加载到内存中,而类则是程序的基本执行单元。类加载过程阶段。

weixin_51105979的博客 878

回顾Java基础——深入理解java类实例化顺序

一、Java虚拟机类加载机制 1、jvm将java源文件被编译成class文件,然后将class文件 加载到内存,并对数据进行校验、解析、初始化,最终形成 可以被虚拟机直接使用的java类型。这就是虚拟机的类加载机制。 2、类的生命周期如下: <1>、加载: 根据全类名获取class文件的二进制流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中...

zhangCheng的博客 218

《深入理解JAVA虚拟机》第七章 虚拟机类加载机制

《深入理解java虚拟机 笔记》第七章 虚拟类加载机制 第七章 虚拟类加载机制   

乌鸦大大 1166

深入理解java虚拟机中类加载机制

1.1 概述 虚拟机把描述一个类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成被java虚拟机使用的Java类型。这就是虚拟机的类加载机制。 Calss文件由类加载器加载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息间接调用Calss对象的功能。 编译器会把.java文件编译成.class文件,也就是字节码文件。 1.2 类加载的生命周期 类加载的整个

Deronn的博客 1230
上一篇: 函数依赖集闭包、属性集闭包、超键、候选键和最小函数依赖集的求法。
下一篇: docker之vim apt-get update失败
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值