首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 类在 Tomcat 中是如何加载的?

比如JVM启动时,会通过不同的类加载器加载不同的类。当用户在自己的代码中,需要某些额外的类时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。...当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制): 用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。...当Tomcat启动时,会创建几种类加载器: 1、Bootstrap 引导类加载器 加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下) 2、System 系统类加载器 加载Tomcat...当应用需要到某个类时,则会按照下面的顺序进行类加载: 1、使用bootstrap引导类加载器加载 2、使用system系统类加载器加载 3、使用应用类加载器在WEB-INF/classes中加载 4、使用应用类加载器在...这是因为Eclipse中的src文件夹中的文件Java以及webContent中的JSP都会在Tomcat启动时,被编译成class文件放在 WEB-INF/class中。

2.5K20

【JavaSE专栏60】静态代码块,Java类加载过程中执行的一段代码

主打方向:Vue、SpringBoot、微信小程序 本文讲解了 Java 中静态代码块概念及语法,并给出了样例代码。静态代码块是 Java 类在加载过程中执行的一段代码。...---- 一、什么是静态代码块 静态代码块是在 Java 类加载过程中执行的一段代码,它用于对类进行初始化操作。 静态代码块在类第一次被加载时执行,并且只会执行一次,它的语法格式如下。...---- 二、为什么要用到静态代码块 在 Java 中,静态代码块的主要作用是在类加载的过程中执行一些特定的初始化操作。下面是使用静态代码块的 4 个常见的场景,请同学们认真学习。...加载驱动程序:在 Java 中,加载数据库驱动程序通常需要使用静态代码块。静态代码块可以在类加载时执行相关的驱动程序加载操作,从而确保在使用数据库之前驱动程序已经被正确加载。...但是静态代码块可以通过创建对象实例来间接访问非静态成员。 五、静态代码块的执行顺序是怎样的? 答:当一个类被加载时,静态代码块会按照定义的顺序依次执行。

1.6K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【JAVA-Day60】深入理解静态代码块:Java类加载过程中关键的代码段

    ⌨ 深入理解静态代码块:Java类加载过程中关键的代码段 摘要 在本技术博客中,我们将深入研究Java中的静态代码块,揭示其在类加载过程中的核心功能和关键作用。...让我们深入探索静态代码块的本质及其在 Java 类加载过程中的关键作用。 静态代码块是什么? 静态代码块是使用 static 关键字定义的一段代码,它在类第一次加载时执行,并且只执行一次。...它与普通的代码块类似,但有着自身独特的特性和作用。 在Java类加载中的角色 类加载过程: 静态代码块在类加载过程中首先被执行。在类加载时,它比构造方法更早地被调用。...静态代码块在继承中的作用是什么? 解答示例: 在继承中,静态代码块是在子类加载时执行的,父类的静态代码块优先于子类的执行。它们各自独立地完成类加载时的初始化操作。 5. 静态代码块有什么限制?...本文深入探讨了静态代码块在 Java 类加载阶段的关键作用,以及在实际开发中的灵活运用。让我们简要总结一下: 静态代码块的作用: 在类加载时执行,用于初始化静态变量或进行一次性的资源加载。

    10110

    反射机制在Java类加载和执行子系统中的作用,在实践中应用反射

    反射机制在Java类加载和执行子系统中起到了以下作用:动态加载类:通过反射,可以在运行时动态加载并实例化类。这使得程序能够在运行时根据实际需要加载不同的类,从而更加灵活和可扩展。...在实践中,通常使用反射来解决以下问题:动态加载类:当需要根据配置文件或用户输入来加载不同的类时,我会使用反射来根据类名动态加载并实例化类。...例如,在基于注解的框架中,我会使用反射来扫描被注解标记的类,并根据注解配置执行相应的操作。...动态获取类的信息:当需要在运行时获取类的相关信息时,我会使用反射来获取类名、字段、方法等信息,并进行相应的处理。例如,在ORM框架中,我会使用反射来获取数据库表与Java类的映射关系。...总结反射机制在Java类加载和执行子系统中提供了动态加载类、动态调用方法以及获取类的信息等功能,可以使程序更加灵活和可扩展。

    21691

    《深入理解java虚拟机》笔记(8)类的加载机制

    ()方法是由编译器自动收集类中的所有类变量赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件出现的顺序所决定的。...静态语句块中只能访问到定义在静态语句块之前的变量,定义在之后的变量可以赋值,但不能访问。...clinit方法是类构造器方法,是在JVM加载期间的初始化阶段才会调用。 执行目的不同:init是对非静态变量解析初始化,而clinit是对静态变量,静态代码块进行初始化。...当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。...当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。

    23950

    NoClassDefFoundError 和 ClassNotFoundException异常

    例如:加载一个本不存在的类 Class.forName("acb.s.sad") 3.NoClassDefFoundError 当发生NoClassDefFoundError ( java  fhadmin.cn...当JVM尝试以下操作: 使用new实例化一个类 使用方法调用加载类 当编译器可以成功编译类,但java运行时找不到类文件时,就会发生改错误。...它通常发生在执行静态块或初始化类的静态字段时出现异常,因此类初始化失败 4.解决方案 主要原因是运行时类文件(类路径中)不可用。解决方法: 保证类路径中是否可以使用包含该类的类或jar。...ClassNotFoundException是java运行时加载类时抛出的异常(Exception),并且名称是在运行时提供。...NoClassDefFoundError是该类在编译时存在,但java运行时没法在路径上找到。

    1.1K20

    类加载过程中几个重点执行顺序整理

    如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2、 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3、 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内...,再进行显式初始化     4.4、当静态区域下的所有静态变量显式初始化完后,执行静态代码块 5,当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。...实例的初始化过程: 1、在堆内存中开辟一块空间 2、 给开辟空间分配一个地址 3、 把对象的所有非静态成员加载到所开辟的空间下 4、 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化 5...当再次有需要时,会检查Sample类的Class对象是否存在,如果存在会直接使用,不再重新加载;如果不存在Sample类会被重新加载,在Java虚拟机的堆区会生成一个新的代表Sample类的Class实例...【总结】 (1) 启动类加载器加载的类型在整个运行期间是不可能被卸载的(jvm和jls规范); (2) 被系统类加载器和标准扩展类加载器加载的类型在运行期间不太可能被卸载,因为系统类加载器实例或者标准扩展类的实例基本上在整个运行期间总能直接或者间接的访问的到

    1.5K20

    异常处理 | 优雅,永不过时

    在 Java 中,异常是指在程序执行期间发生的意外情况,它可能导致程序终止或产生不确定的结果。...语法:throw 异常对象;当使用 throw 关键字时,在代码中明确指定某个异常对象的抛出。这通常发生在方法内部,表示在特定条件下手动引发异常。...NoClassDefFoundError:当Java虚拟机尝试加载某个类,但找不到该类的定义时,抛出此错误。...LinkageError:当类的链接过程失败时,抛出此错误,例如虚拟机找到了类的定义,但找不到该类的父类。AssertionError:当断言语句(assert)失败时,抛出此错误。...ExceptionInInitializerError:当类的初始化过程中发生异常时,抛出此错误。通常是在类的静态初始化块中发生异常。

    52162

    「JAVA」Java基础之堆、栈、方法区、类加载器——JVM内存模型分析

    Java堆:是在虚拟机启动时创建的一块内存区域,是被所有线程共享的,因为要通过其中的存储的对象调用方法和属性。...所有的对象实例(直接或者间接使用new关键字创建的对象)以及数组都要在堆上分配(使用new关键字,就表示在堆中开辟一块新的存储空间)。...Java的自动垃圾回收机制: 在Java中,程序员就不需要再像C/C++语言中的那样再去手动控制内存的释放,由GC自动的、不定时的去回收垃圾对象,当JVM发觉内存资源紧张的时候,就会自动地去清理无用对象...校验和解析: 检查加载进来的class的正确性; 给类的静态变量分配存储空间; 将符号引用转化成直接引用; 3.初始化:对静态变量,静态代码根据其数据类型块执行初始化操作; 一旦将类加载进JVM中,便不会再次加载了...当一个类加载器接到一个类加载请求时,会先检查是否加载过,若没有它会把请求转给父类加载器的loadClass()去完成,层层皆是如此,所以所有的加载请求都会传到最顶层的类加载器中; 若是父加载器不存在,会使用根加载器

    66210

    深入Java类加载全流程,值得你收藏

    什么是类加载(或者初始化) Java源代码经过编译之后转换成class文件,在系统运行期间当需要某个类的时候,如果内存中还没该class文件,那么JVM需要对这个类的class文件进行加载,连接,初始化...重点是:类的加载都是在程序运行期间完成的,这提供了无限可能,意味着你可以在某个阶段对类的字节码进行修改,JVM也确实提供了这样的功能。...Java虚拟机启动时被标明为启动类的类(单测时),Main方法的类。 初始化时类变量会被赋予真正的值,也就是开发人员在代码中定义的值,也会执行静态代码块。...卸载 类卸载有个前提,就是class的引用是空的,要么程序中手动置为空,要么进程退出时JVM销毁class对象,然后JVM退出。只要class引用不存在,那么这个类就可以回收了。...提一下接口的加载 当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,当真正用到父接口的时候才会加载该接口,如下代码,执行main方法,Parent5

    38520

    深入JVM类加载机制

    在java中语言中类的加载、连接和初始化过程都是在程序运行期间完成的,因此在类加载时的效率相对编译型语言较低,除此之外,只有在任何一个类只有在运行期间使用到该类的时候才会将该类加到内存中。...()方法是由编译器自动收集类中所有的类变量的赋值动作和静态语句块(static{})中的语句合并而成。...,父类的静态语句块和静态变量优先于子类中变量赋值操作。 ...当类加载器在加载ClassA的时候,发现引用了ClassB,此时类加载如果检测到ClassB还没有被加载,则先回去加载.当ClassB加载完成后,继续回来加载ClassA.换句话说,类会通过自身对应的来加载其加载其他引用的类...JVM规定,对于任何一个类,都需要由加载它的类加载器和这个类本身一同确立在java虚拟机中的唯一性,通俗点就是说,在jvm中判断两个类是否是同一个类取决于类加载和类本身,也就是同一个类加载器加载的同一份

    43030

    JVM常见面试题

    对应着一个栈帧在虚拟机中从入栈到出栈的过程。 通常说的栈就是指局部变量表部分,存放编译期间可知的8种基本数据类型,及对象引用和指令地址。...局部变量表是在编译期间完成分配,当进入一个方法时,这个栈中的局部变量分配内存大小是确定的。 会有两种异常StackOverFlowError和 OutOfMemoneyError。...如果没有,那必须先执行相应的类的加载过程。 2. 对象分配内存 对象所需内存的大小在类加载完成后便完全确定(对象内存布局),为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。...,即每个线程在Java堆中预先分配一小块内存(TLAB)。...在调用loadClass方法时,会先根据委派模型在父加载器中加载,如果加载失败,则会调用自己的findClass方法来完成加载。 0x11.

    59820

    JVM的类加载机制

    Java的动态绑定和静态绑定 在Java中,当你调用一个方法时,可能会在编译时期(compile time)解析(resolve),也可能实在运行时期(runtime)解析,这全取决于到底是一个静态方法...类在何时会被初始化 遇到new(创建对象), getstatic(读取静态字段),putstatic(设置静态字段),invokestatic(执行静态方法)的指令的时候,类才会被初始化 使用Java类中的反射...;Java中的多态(动态绑定)其实就是跟类的解析有关,类的解析可能发生在程序运行期间(类初始化之后),因为对于多态来说在类的加载,验证,准备过程中并不知道实际要调用哪一个对象的方法,只有在执行代码的时候才知道实际需要执行哪一个对象的方法...类初始化 类初始化是类加载过程的最后一步了,初始化其实就是执行构造器的过程,构造器是JVM自动生成的,它是去自动搜集类的变量,静态代码块中的语句合并产生的 ()和类的构造函数不同,JVM...()方法,其他线程都会等待,如果在一个类()方法中有耗时人物,可能造成多线程阻塞,例如在静态代码块中执行耗时操作 类加载器 类加载器(ClassLoader)注意一点,比较两个类是否

    1.3K30

    类加载

    1.加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。...错误) 加载方式 隐式加载 创建类对象 使用类的静态域 创建子类对象 使用子类的静态域 在JVM启动时,BootStrapLoader会加载一些JVM自身运行所需的class 在JVM启动时,ExtClassLoader...在Java中对类变量进行初始值设定有两种方式: 声明类变量是指定初始值 使用静态代码块为类变量指定初始值 JVM初始化规则 类初始化时机:只有当对类的主动使用的时候才会导致类的初始化 Java程序对类的使用方式可以分为两种..., 只有直接定义这个字段的类才会被初始化,因此,通过其子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化 Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe...只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类 缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在

    49830

    深入理解Java类加载器(ClassLoader)

    而类加载必然涉及类加载器,下面我们先了解一下类的加载 类的加载(类初始化): 1.在java代码中,类型的加载,连接,初始化过程都是在程序运行期间完成的,类从磁盘加载到内存的三个阶段。...程序运行期间: 程序运行期间完成的典型例子就是动态代理,其实很多语言编译期间就完成了加载,也正因为这个特性给Java程序提供更大的灵活性,提供了更多的可能性 类加载注意事项: 类加载器并不需要等到某个类被首次主动使用时再加载它...在java程序的日常开发中,类的加载几乎是前面三种类加载相互配合执行的,在必要时,我们还可以自定义类加载器(ClassLoader),因为JVM自带的类加载只是懂得从本地文件系统加载标准的class文件...从前面分析可知,findClass()方法是在loadClass()方法中被调用的。当loadClass()方法中父类加载器加载失败后,则会调用自己的findClass()方法来完成来加载。...ClassLoder.loadClass():只是将类的.class文件加载到JVM中,并不会执行类的static块,只有在newInstance时才会执行static块。

    36310

    面试官问我JVM垃圾回收算法,还好我看了这篇

    每个栈帧中的本地变量表都是在类被加载的时候就确定的,每一个栈帧中分配多少内存基本上是在类结构确定时就已知了,因此这几块区域内存分配和回收都具备确定性,就不需要过多考虑回收问题了....Java堆中存放JVM运行期间的所有对象,虽然每个对象的内存大小在加载该对象所属类的时候就确定了,但究竟创建多少个对象只有在程序运行期间才能确定....方法区中存放类信息、静态成员变量、常量.类的加载是在程序运行过程中,当需要创建这个类的对象时才会加载这个类.因此,JVM究竟要加载多少个类也需要在程序运行期间确定....只要一个类被虚拟机加载进方法区,那么在堆中就会有一个代表该类的对象:java.lang.Class.这个对象在类被加载进方法区的时候创建,在方法区中该类被删除时清除. 4 垃圾收集算法 现在我们知道了判定一个对象是无效对象...而且,在新生代中使用"复制"算法,当Eden+Survior中都装不下某个对象时,可以使用老年代的内存进行"分配担保"; 而如果在老年代使用该算法,那么在老年代中如果出现Eden+Survior装不下某个对象时

    72521

    “深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制“

    当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。...() 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。...特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle...当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。

    12200

    Java 基础概念·Java 虚拟机

    当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。...() 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。...特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle...当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。

    43720

    Java虚拟机知识点快速复习手册(下)

    () 方法具有以下特点: 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。...特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化主类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle...当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。...3.如果Bootstrap ClassLoader加载失败(在JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。

    40720

    java虚拟机

    Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC Roots 一般包含以下内容: 虚拟机栈中局部变量表中引用的对象 本地方法栈中 JNI 中引用的对象 方法区中类静态属性引用的对象...特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。...因此虚拟机中第一个执行 () 方法的类肯定为 java.lang.Object。 由于父类的 () 方法先执行,也就意味着父类中定义的静态语句块的执行要优先于子类。...当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类; 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle...当父类加载器加载失败时抛出 ClassNotFoundException,此时尝试自己去加载。

    81320
    领券