首页
学习
活动
专区
圈层
工具
发布

Java是怎么加载类的

庖丁解牛--Java的类加载机制 Java的类加载机制是最容易被忽略的知识,不管是基础,还是往高级开发进阶,都需要了解类的加载机制。...当然最简单的就是当前项目路径下没有这个类。 那么Java是怎么查找项目路径下的类的呢,看看下面这段代码 ?...双亲委托 Java类的加载是由几个ClassLoader进行的,他们分别是 · BootStrapClassLoader · ExtensionClassLoader · AppClassLoader...通常配置Java环境第一件事就是设置这个常量,因为这样ExtensionClassLoader才能去找到 jre/lib/ext/ 下的jar和class。他们的加载顺序是怎样的呢?...到这里应该就明白,System类是由ExtensionClassLoader去查找加载,因为已经在JAVA_HOME里有,所以加载的到,而Socker不在ClassLoader的class path中,

1K10

Java虚拟机是如何加载Java类的?

在类、接口和数组类中,数组类是由 Java 虚拟机直接生成的,其他两种则有对应的字节流。无论是直接生成的数组类,还是加载的类,Java 虚拟机都需要对其进行链接和初始化。...虚拟机的加载流程是什么? 1.加载 是指查找字节流,并且据此创建类的过程。上面提过数组类是由Java虚拟机直接生成的,所以加载过程针对的是生成字节流的类与接口。...如何找到这些字节流,则需要虚拟机借助类加载器。 启动类加载器是由 C++ 实现的,没有对应的 Java 对象,因此在 Java 中只能用 null 来指代。...故除了启动类加载器之外,其他的类加载器都是java.lang.ClassLoader 的子类,因此有对应的 Java 对象。 扩展类加载器的父类加载器是启动类加载器。...总结 虚拟机加载Java类是Java 虚拟机将字节流转化为 Java 类的过程。这个过程可分为加载、链接以及初始化三大步骤。 加载:是指查找字节流,并且据此创建类的过程。

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

    Java虚拟机是如何加载Java类的?

    这些不同形式的字节流,都会被加载到 Java 虚拟机中,成为类或接口。为了叙述方便,下面我就用“类”来统称它们。 无论是直接生成的数组类,还是加载的类,Java 虚拟机都需要对其进行链接和初始化。...加载 加载,是指查找字节流,并且据此创建类的过程。前面提到,对于数组类来说,它并没有对应的字节流,而是由 Java 虚拟机直接生成的。...Java SE 中除了少数几个关键模块,比如说 java.base 是由启动类加载器加载之外,其他的模块均由平台类加载器所加载。...在 Java 虚拟机中,类的唯一性是由类加载器实例以及类的全名一同确定的。即便是同一串字节流,经由不同的类加载器加载,也会得到两个不同的类。...加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。 链接,是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。

    1K71

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

    很纳闷....为什么会优先加载src下的Java文件(编译出的class),而不是jar包中的class呢? 现在了解Tomcat的类加载机制,原来一切是这么的简单。 ?...需要注意的是,不同的类加载器加载的类是不同的,因此如果用户加载器1加载的某个类,其他用户并不能够使用。...WEB-INF/lib中加载 5、使用common类加载器在CATALINA_HOME/lib中加载 四、问题扩展 通过对上面Tomcat类加载机制的理解,就不难明白 为什么Java文件放在Eclipse...而Eclipse外部引用的jar包,则相当于放在 WEB-INF/lib 中。 因此肯定是 Java文件或者JSP文件编译出的class优先加载。...通过这样,我们就可以简单的把Java文件放置在src文件夹中,通过对该Java文件的修改以及调试,便于学习拥有源码Java文件、却没有打包成xxx-source的jar包。

    5.1K20

    你知道 Java 类是如何被加载的吗?

    我在向朋友解释的时候是这么说的:双亲委派模型中,ClassLoader 在加载类的时候,会先交由它的父 ClassLoader 加载,只有当父 ClassLoader 加载失败的情况下,才会尝试自己去加载...这样可以实现部分类的复用,又可以实现部分类的隔离,因为不同 ClassLoader 加载的类是互相隔离的。...不过贸然的向别人解释双亲委派模型是不妥的,如果在不了解 JVM 的类加载机制的情况下,又如何能很好的理解“不同 ClassLoader 加载的类是互相隔离的”这句话呢?...所以为了理解双亲委派,最好的方式,就是先了解下 ClassLoader 的加载流程。 Java 类是如何被加载的 2.1:何时加载类 我们首先要清楚的是,Java 类何时会被加载?...2.3:JVM 是怎么加载类的 JVM 默认用于加载用户程序的 ClassLoader 为 AppClassLoader,不过无论是什么ClassLoader,它的根父类都是 java.lang.ClassLoader

    1.3K30

    为什么java中的 HashMap 的加载因子是0.75?

    引言在Java中,HashMap是一种常用的数据结构,用于存储键值对。它的设计目标是提供高效的插入、查找和删除操作。在HashMap的实现中,加载因子(Load Factor)是一个重要的概念。...本文将探讨为什么Java中的HashMap的加载因子被设置为0.75。背景在了解加载因子的作用之前,我们先来看一下HashMap的内部实现。...加载因子的选择是一个权衡的结果,它既要保证HashMap的性能又要节约内存空间。为什么Java中的HashMap的加载因子被设置为0.75呢?...如果对内存空间要求较高,可以适当增加加载因子;如果对性能要求较高,可以适当减小加载因子。以下是一个示例代码,演示了如何在Java中使用HashMap,并说明了加载因子的作用。...结论Java中的HashMap的加载因子被设置为0.75,是为了在时间和空间上取得一个平衡。

    1.3K20

    你知道 Java 类是如何被加载的吗?

    我在向朋友解释的时候是这么说的:双亲委派模型中,ClassLoader 在加载类的时候,会先交由它的父 ClassLoader 加载,只有当父 ClassLoader 加载失败的情况下,才会尝试自己去加载...这样可以实现部分类的复用,又可以实现部分类的隔离,因为不同 ClassLoader 加载的类是互相隔离的。...不过贸然的向别人解释双亲委派模型是不妥的,如果在不了解 JVM 的类加载机制的情况下,又如何能很好的理解“不同 ClassLoader 加载的类是互相隔离的”这句话呢?...所以为了理解双亲委派,最好的方式,就是先了解下 ClassLoader 的加载流程。 Java 类是如何被加载的 2.1:何时加载类 我们首先要清楚的是,Java 类何时会被加载?...2.3:JVM 是怎么加载类的 JVM 默认用于加载用户程序的 ClassLoader 为 AppClassLoader,不过无论是什么ClassLoader,它的根父类都是 java.lang.ClassLoader

    1.5K20

    缺省参数是编译期间绑定的,而不是动态绑定

    <<endl; } }; int main() { B b; A &a = b; a.Fun(); return 0; } //虚函数动态绑定=>B,非A,缺省实参是编译时候确定的...=>10,非20  输出:B::Fun with number 10 条款38:   决不要重新定义继承而来的缺省参数值  本条款的理由就变得非常明显:虚函数是动态绑定而缺省参数值是静态绑定的。...这意味着你最终可能调用的是一个定义在派生类,但使用了基类中的缺省参数值的虚函数.  为什么C++坚持这种有违常规的做法呢?答案和运行效率有关。...如果缺省参数值被动态绑定,编译器就必须想办法为虚函数在运行时确定合适的缺省值,这将比现在采用的在编译阶段确定缺省值的机制更慢更复杂。...做出这种选择是想求得速度上的提高和实现上的简便,所以大家现在才能感受得到程序运行的高效;当然,如果忽视了本条款的建议,就会带来混乱。

    1.9K60

    Java类加载-加载

    什么是类加载 虚拟机把描述类的数据从Class(Class文件或者网络或者其他地方,其实都是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。...这就是虚拟机的类加载。 类加载概念 ? 上图是类加载和卸载的整个过程示意图,其中验证、准备、解析统称为连接阶段。...如果一个java.lang.invoke.MethodHandle实例的最后解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,如果方法句柄所对应的类没有进行过初始化...类加载-加载阶段 加载是类加载的第一个阶段,加载阶段的主要目标是: 通过一个类的全限定名来获取定义此类的二进制字节流 将字节流的静态信息结构转换为方法区(元数据区)的运行时数据结构 在内存中生成一个代表这个类的...对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。

    2.1K40

    类是如何加载的?

    在 Java 中,类加载的流程有一个专门的机制叫做“类加载机制”。类加载机制是指一个类在 Java 虚拟机(JVM)中的执行流程,它也是 Java 程序能够正常执行的关键所在,那它的具体执行流程是啥?...java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。...2.1 验证阶段 验证阶段也叫做校验阶段,它主要是用来验证加载到内存中的类是否是安全合规的文件,验证的主要动作大概有以下几个(当然,以下细节如果实在记不住也没关系): 文件格式校验包括常量池中的常量类型...举个例子,比如代码中写的内容是: public static int number = 10; 那么此时是给 number 变量设置的 int 值是默认值 0,而非初始值 10。...3.初始化阶段 初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。

    1K30

    java 类的加载

    加载是将class文件加载到 jvm内存,并为之创建一个大的Class,任何类被系统使用都会建立一个大Class对象。...6.通过java.exe调用类的方法时 类加载器 根类加载器 扩展类加载器 系统类加载 其他加载方式都是属于被动加载...类加载器之间严格遵守父委托机制 Bootsrap 根加载器 主要负责核心类库的加载,例如java.lang 包加载 扩展类加载器 扩展类加载器的父类是根加载器,主要用于加载java_home 下的jre...\lib\ext里面的类库,java实现,可以将自己实现的类打包放到下面加载....线程上下文类加载器 JVM类加载器双亲委托机制的自身缺陷,JDK提供了很多SPI,例如JDBC,JNDI接口,具体的实现有各个不同的厂家进行提供,想要更换连接器,只需要切换即可,但是例如JDBC的接口是由根加载器进行加载

    1.1K10

    iOS开发swift版异步加载网络图片(带缓存和缺省图片)

    iOS开发之swift版异步加载网络图片     与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存。      ...异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?...ZYHImage                     })                 }                              })         }     }      } 缓存的处理这里采用的是写文件的方式...缓存的核心代码如下: class func readCacheFromUrl(url:NSString)->NSData?{         var data:NSData?         ...地址,欢迎指正与扩展:https://github.com/ZYHshao/swift-ZYHWebImage 因xcode的版本不同,swift语言语法随环境时常会变化,此版本在6.1中可用,更高版本中需要修改少部分即可

    2.2K30

    java的类加载

    类加载机制 JVM类加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载是类加载过程中的一个阶段,会在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数据的入口...初始化 初始化阶段是类加载的最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器之外,其他操作都有JVM主导 到了初始化阶段,才开始真正执行类中定义的java程序代码 初始化阶段是 执行类构造器...什么时候触发类加载 什么情况需要开始类加载过程的第一阶段(加载)呢? Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...) 负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被 虚拟机认可(按文件名识别,如 rt.jar)的类。...扩展类加载器(Extension ClassLoader) 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类 库。

    1.5K20

    【Java懒加载与即时加载的使用】

    前言 核心概念 懒加载(Lazy Loading):延迟对象的创建或资源的初始化,直到第一次真正需要使用该对象时才加载。例如,单例模式的懒汉式实现。...即时加载(Eager Loading):在程序启动或类加载时立即初始化对象或资源。例如,单例模式的饿汉式实现。 博客将会介绍如何实现Java懒加载与即时加载的使用。...希望这篇博客对Unity的开发者有所帮助。 大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 欢迎点赞评论哦.下面就让我们进入正文吧 !...提示:以下是本篇文章正文内容,下面案例可供参考 一、原理分析与实现 懒加载原理: 通过条件判断(如 if (instance == null))延迟初始化,结合同步机制(如 synchronized、volatile...总结 本次总结的就是Java懒加载与即时加载的使用实现, 有需要会继续增加功能 如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢 你的点赞就是对博主的支持,有问题记得留言评论哦!

    27810

    类加载过程是怎样的

    一般来说,我们把Java的类加载过程分为三个主要步骤:加载、链接、初始化 加载阶段(Loading) 它是Java将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构(Class对象)...这里可进一步细分为三个步骤: 验证(Verification),这是虚拟机安全的重要保障,JVM需要核检字节信息是符合Java虚拟机规范的,否则就被认为是VerifyError。...前面 java -Xbootclasspath/p: your_App 用法其实很易懂,例如,使用最常见的“/p”,既然是前置,就有机会替换个别基础类的实现。...这里有一个容易混淆的概念,系统(System)类加载器,通常来说,其默认就是JDK內建的应用类加载器,但是它同样是可能修改的,比如: java -Djava.system.class.loader=com.yourcorp.YourClassLoader...但不是所有类加载都遵守这个模型,有的时候,启动类加载器所加载的类型,是可能要加载用户代码的。

    94130

    你真的知道 Java 类是如何被加载的吗?

    你真的知道 Java 类是如何被加载的吗?...不过贸然的向别人解释双亲委派模型是不妥的,如果在不了解JVM的类加载机制的情况下,又如何能很好的理解“不同ClassLoader加载的类是互相隔离的”这句话呢?...所以为了理解双亲委派,最好的方式,就是先了解下ClassLoader的加载流程。 二:Java 类是如何被加载的 2.1:何时加载类 我们首先要清楚的是,Java类何时会被加载?...《深入理解Java虚拟机》给出的答案是: 遇到new、getstatic、putstatic 等指令时。 对类进行反射调用的时候。 初始化某个类的子类的时候。 虚拟机启动时会先加载设置的程序主类。...2.3:JVM 是怎么加载类的 JVM 默认用于加载用户程序的ClassLoader为AppClassLoader,不过无论是什么ClassLoader,它的根父类都是java.lang.ClassLoader

    88710

    Java类加载的顺序

    前言 那一年,呼延十又回想起被加载顺序支配的恐惧,笔试题上,好几个类,几个方法,几个输出语句,让你按照顺序写出输出.我真的是有一句…. 但是呢,我们还是有了解一下的必要的,在编码过程中有许多的应用....由于B类有父类,因此先加载A类. 加载A类的静态代码块,输出A-----static. 加载B类的静态变量,调用了方法,输出B----- static func....加载B类的静态代码块,输出B----- static. 加载A类的普通变量,private int i = aFunc();由于调用了方法,因此输出A----- default....加载A类的构造方法,输出A----- constructor. 加载B类的普通变量,调用了方法,输出B----- default. 加载B类的构造方法,输出了B----- constructor....在这期间,发现一些小的知识点,也记录一下. 静态变量,静态代码块的加载顺序只和代码编写的顺序有关. 普通变量及构造方法,顺序一定是先普通变量,再构造方法的.

    1.7K20

    java类加载器加载机制

    Java的安全模型是的Java成为适于网络环境的技术——《深入Java虚拟机》   在安全方面Java的内置安全模型中使用了一种成为“沙箱”的组件,来保证Java程序对用户的安全,至于什么是“沙箱”...用一个图形表示就是:  引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoader。... 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。... 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。...关于java类加载机制推荐大家看这篇文章《深入探讨 Java 类加载器》,IBM文档,写的很详细。

    1.6K10

    java类的加载机制

    并为其生成对应的java.lang.class对象。一旦一个类被载入JVM了,同一个类就不会被再次加载。 类加载器是负责将可能是网络上、也可能是磁盘上的class文件加载到内存中。...也就是说,在JAVA中的同一个类,如果用不同的类加载器加载,则生成的class对象认为是不同的。...当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构 1、启动类加载器BootstrapClassLoader: 是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME...2、扩展类加载器Extension ClassLoader: 该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的...双亲委派模式优势 采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次

    66820

    VM的类加载的过程是通过引导类加载器

    下面我们来逐步解析 加载# 这里的加载是微观上的,是类加载过程中的一小步,也是第一步,类加载过程中的加载是宏观上的。...初始化# 初始化就是执行类的构造器方法,是类加载的最后一步,这一步 JVM才开始真正执行类中定义的 Java 程序代码 这个方法不需要定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并来的...除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader: 类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器...需要注意的是,Java虚拟机对Class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的Class文件加载到内存生成Class对象。...当然是不会的! 因为Object类是Java的核心库类,由BootstrapClassLoader加载,而自定义的java.lang.Object类应该是由AppClassLoader来加载。

    1.1K30
    领券