java类加载(java类加载过程详解)

梦里梦外; 2023-09-26 15:29 262阅读 0赞

Java虚拟机类加载过程是什么样的?

虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。

1。加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。

1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final静态字段除外),以及调用类的静态方法的时候。

java类加载(java类加载过程详解)\_java类加载(java类加载过程详解)

什么是java类加载机制?

getParent方法返回的是上级类加载器

ExtClassLoader,但是,从类文件的观念看,他们不是继承关系,只能看做引用关系

在加载的时候,如果在我这一层,首先会去找父亲,看看他加载了没,父亲再找父亲的父亲加载了没,

没有才一步步下来,最后由我自己加载,这里讲父亲,不是父类!,有点子债父还的意思

好处是安全,因为classLoader也是个类,所以如果不用这个机制,想解析一个很简单的类,写病毒的人可以自己写个classLoader用来解析这些本来系统自带的ClassLoader就可以解析的类在里面加点病毒代码,这样解析一些简单的类的时候,它会去找加载器,找到了我自己写的病毒Classloader,如果加载的话就出事了,java这个体系,它即使找到了病毒Classloader,也不会立刻使用,它会往上找如果他的长辈(系统自带的能解析这个类的ClassLoader)能加载,就由系统解决了,就用不上这个病毒ClassLoader类了,所以说,比较安全!。

java 类加载先后顺序

根据static的特性,在类被加载的时候执行!

所以我们可以使用static来进行测试!

测试代码如下:

public class Test{

public static void main(String[] args){

//

}

static{

System.out.println(“class Test”);

}

class A{

static{

System.out.println(“class A”);

class B{

static{

System.out.println(“class B”);

执行结果:

class Test

结论:实际上,在java中,只有你已经用到的类,JVM才会执行加载,而且加载顺序是:主类—>其他类(与在主类中被使用的顺序相同)

验证代码如下:

public class Test{

public static void main(String[] args){

//

new A();

new B();

}

static{

System.out.println(“class Test”);

}

class A{

static{

System.out.println(“class A”);

class B{

static{

System.out.println(“class B”);

执行结果:

class Test

class A

class B1.父类静态代码块;

2.子类静态代码块;

3.父类非静态代码块;

4.父类构造函数;

5.子类非静态代码块;

6.子类构造函数;

public class ExA {

static {

System.out.println(“父类静态代码块。”);

}

public ExA() {

System.out.println(“父类构造函数。”);

}

{

System.out.println(“父类非静态代码块。”);

}

public static void main(String[] args) {

new ExB();

}

class ExB extends ExA {

static {

System.out.println(“子类静态代码块。”);

}

{

System.out.println(“子类非静态代码块。”);

}

public ExB() {

System.out.println(“子类构造函数。”);

}

执行结果:父类静态代码块。子类静态代码块。父类非静态代码块。父类构造函数。子类非静态代码块。子类构造函数。父类到子类

静态到非静态类的加载不是在编译的时候,编译只是将Java的源文件编译成字节码文件(*.class),而,但Java程序在执行的时候才开始加载所需要的类,Java程序的入口时主方法,所以先加载的肯定是Test类,由于没有使用到A和B类,所以执行的时候就没有加载他们。

本人也是初学者,回答有错误的话请别见怪!

java类加载(java类加载过程详解)\_java类加载(java类加载过程详解)\_02

Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗

使用的类,编译/运行时都会被加载。

加载/装载没有区别,翻译的词汇选择因人而异了

运行 javac /java 时 加上 -verbose 选项就可以看到了。你好!

我认为java类在编译的时候就被加载,两个理由:

例1:import另外一个包下的类,如果到运行的时候才加载,那能import成功吗?

例2:方法的重载,又叫编译时多态性,类都没有加载,哪来的方法重载?

仅代表个人观点,不喜勿喷,谢谢。运行期。不一样。Java中类加载出现在运行期间。类加载=类装载 就是ClassLoader

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java过程

    目录 概述 类加载时机 类加载过程 加载 验证 文件格式验证 元数据验证 字节码校验 符号引用校验 准备 解析 初始化 类加载器 双亲委派模型

    相关 Java过程详解

    Java是一种面向对象的编程语言,它的核心特性之一是动态类加载和运行时环境。在Java中,类加载是将类的字节码数据加载到内存中,并转换为可以执行的Java对象的过程。本文将详细

    相关 Java过程

    一、前言 我们都知道计算机的底层逻辑都是0和1的编码,当然除了现在所研究的量子计算除外。那么我们在计算机所做的一切操作,底层原理是不是都可以翻译到0和1呢。如果刨根问底的话,

    相关 Java过程

    类的加载简介 1.类加载一般分为三大阶段:加载、连接和初始化 ![类加载三个大阶段(图来自zejian\_)][zejian] 加载阶段:主要查找class文件(二

    相关 Java过程

    Java类加载过程 首先是加载过程(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),...