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

java类加载器如何识别重复的类?

Java类加载器使用全限定类名和加载该类的特定类加载器实例来唯一标识一个类。全限定类名包括类的包名和类名。因此,即使两个类具有相同的类名,但只要它们的包名或者加载它们的类加载器不同,Java就会将它们视为不同的类。

在Java中,类加载器的层次结构通常如下:

  • 引导类加载器(Bootstrap ClassLoader):加载Java核心库,如java.lang.*等。
  • 扩展类加载器(Extension ClassLoader):加载Java的扩展库。
  • 系统类加载器(System ClassLoader):加载用户类路径(Classpath)上的类库。

当加载一个类时,Java会首先询问父类加载器是否可以加载该类,这个过程会一直向上递归,直到引导类加载器。如果父类加载器可以加载该类,那么就由父类加载器加载;否则,子类加载器尝试自己加载。这就是所谓的父亲委派机制(Parent Delegation Model)。

因此,如果两个类具有相同的全限定类名,并且由同一个类加载器加载,那么Java会认为它们是同一个类。如果试图重复加载,类加载器会从其缓存(已加载类的内部表示)中返回类,而不会实际执行加载过程。如果两个类由不同的类加载器加载,即使它们的全限定类名相同,Java也会将它们视为不同的类。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java 自定义加载_Java如何自定义加载

如何自定义加载 如果想要编写自己加载,只需要两步: 继承ClassLoader 覆盖findClass(String className)方法 ClassLoader超loadClass...方法用于将加载操作委托给其父加载去进行,只有当该类尚未加载并且父加载也无法加载该类时,才调用findClass方法。...加载相关API 1. java.lang.Class ClassLoader getClassLoader(): 获取加载该类加载 2.java.lang.ClassLoader ClassLoader...构建一个加载,它可以从给定URL处加载。...4.java.lang.Thread ClassLoader getContextClassLoader():获取加载,该线程创建者将其指定为执行该线程时最适合使用加载

1.3K10

Java加载

分类 系统自带加载 启动加载(BootStrap) c++编写 加载核心库 java.* 3.拓展加载 (Extension) java编写 加载拓展库 javax.* 4.应用程序加载...(AppClassLoader)java编写 加载程序所在目录 5.用户自定义加载 自定义加载 java编写 定制化加载 我们先了解2个方法 第一个方法 findClass /**...我们通过加载加载这个文件!我们通过加载创建该实例!他就会打印构造函数中一句话!废话不多说我们直接上图吧!...然后开始编写我们自己加载!...在测试之前回顾一下java一个基础!在被加载时候,会自动调用空构造函数!所以我们外部类,一旦被加载就会打印 HelloClasssLoader!!!来吧,试一下吧!

34220

Java加载

什么是加载 通过一个全限定名来获取描述此类二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要。实现这个动作代码模块称为“加载”。...Java虚拟机第一个加载是Bootstrap,这个加载很特殊,它不是Java,因此它不需要被别人加载,它嵌套在Java虚拟机内核里面,也就是JVM启动时候Bootstrap就已经启动,它是用...当Java虚拟机要加载一个时,到底派出哪个加载加载呢? 首先当前线程加载加载线程中第一个(假设为A)。 如果类A中引用了B,Java虚拟机将使用加载A加载加载B。...比如String.class,每次加载都委托给父 加载,最终都是BootstrapClassLoader,都保证java核心都是BootstrapClassLoader加载,保证了java安全与稳定性...,自定义加载不仅可以定义如何查找class,还可以实现资源隔离等等。

76831

java加载过程和加载分析

那JVM是如何来让我们写java文件运行呢?    这个问题通常问法好像是:如何加载。   ...再次之前我想补充一个名词解释,加载:虚拟机把  实现 加载阶段中“通过一个全限定名来获取描述此类二进制字节流” 这个过程代码称为加载 1....()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动加载,这时会调用启动加载加载,但由于启动加载时所有加载, 所以其父加载为空(相当于Object...是所有,这种感脚~),然后它就会调用自己findClass方法来自启动加载 ; 2.标准扩展加载启动时就会借助其父 启动加载 作为父加载 来启动了; 3.系统加载启动时就会借助其父...:对字节码描述信息进行语义分析,保证其描述内容符合java语言语法规范,能被java虚拟机识别; 3.字节码验证:该部分最为复杂,对方法体内内容进行验证,保证代码在运行时不会做出什么危害虚拟机安全事件

1.5K80

java加载过程和加载分析

那JVM是如何来让我们写java文件运行呢?    这个问题通常问法好像是:如何加载。   ...再次之前我想补充一个名词解释,加载:虚拟机把  实现 加载阶段中“通过一个全限定名来获取描述此类二进制字节流” 这个过程代码称为加载 1....()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动加载,这时会调用启动加载加载,但由于启动加载时所有加载, 所以其父加载为空(相当于Object...是所有,这种感脚~),然后它就会调用自己findClass方法来自启动加载 ; 2.标准扩展加载启动时就会借助其父 启动加载 作为父加载 来启动了; 3.系统加载启动时就会借助其父...:对字节码描述信息进行语义分析,保证其描述内容符合java语言语法规范,能被java虚拟机识别; 3.字节码验证:该部分最为复杂,对方法体内内容进行验证,保证代码在运行时不会做出什么危害虚拟机安全事件

58150

加载如何实现隔离

加载如何实现隔离 什么是隔离技术 如何实现隔离 实操 1 重写 findClass 重写 loadClass 总结 ---- 更多加载知识点,可以看一下我之前写过关于加载文章:...这里用到了 Java 一个机制:不同类加载加载在 JVM 看来是两个不同,因为在 JVM 中一个唯一标识是 加载+名。...---- 如何实现隔离 前面我们提到隔离就是让不同模块 jar 包用不同加载加载,要做到这一点,就需要让 JVM 能够使用自定义加载加载我们写以及其关联。 那么如何实现呢?...通过这种方式,我们只要让模块 main 方法使用不同加载加载,那么每个模块都会使用 main 方法加载加载,这样就能让多个模块分别使用不同类加载。...要实现自己加载,首先让自定义加载继承 java.lang.ClassLoader,然后重写加载方法,这里我们有两个选择,一个是重写 findClass(String name),一个是重写

37340

java加载是什么_加载有几种

大家好,又见面了,我是你们朋友全栈君。 加载是有了解吗? 解析:底层原理考察,其中涉及到加载概念,功能以及一些底层实现。...答:顾名思义,加载(class loader)用来加载 Java Java 虚拟机中。...一般来说,Java 虚拟机使用 Java 方式如下:Java 源程序(.java 文件)在经过 Java 编译编译之后就被转换成 Java 字节代码(.class 文件)。...加载负责读取 Java 字节代码,并转换成 java.lang.Class一个实例。每个这样实例用来表示一个 Java 。...通过此实例 newInstance()方法就可以创建出该类一个对象。实际情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成,也可能是通过网络下载

43010

java加载加载机制

在沙箱组件中包括装载结构,加载体系结构也是java沙箱第一道防线,因为程序都是通过加载才能够加载到JVM中。   加载有三方面的作用: 1. 它防止了恶意代码去干涉善意代码 2....其中一个大家所熟悉词就是“双亲委派机制”,所谓“双亲委派机制”,就是某个特定加载在接到加载请求时,首先将加载任务委托给父加载,依次递归,如果父加载可以完成加载任务,就成功返回;只有父加载无法完成此加载任务时... 扩展加载(extensions class loader):它用来加载 Java 扩展库。Java 虚拟机实现会提供一个扩展库目录。该类加载在此目录里面查找并加载 Java 。... 系统加载(system class loader):它根据 Java 应用路径(CLASSPATH)来加载 Java 。一般来说,Java 应用都是由它来完成加载。...关于java加载机制推荐大家看这篇文章《深入探讨 Java 加载》,IBM文档,写很详细。

97510

【Android 逆向】加载 ClassLoader ( 启动加载 | 扩展加载 | 应用加载 | 加载双亲委托机制 )

文章目录 一、加载 二、加载双亲委托机制 一、加载 ---- Java 虚拟机 ClassLoader 加载 : Bootstrap ClassLoader : 启动加载 , 该 加载由...C/C++ 实现 , 加载 Java 核心库 , 如 java.lang 包下系统 ; Java 中无法和获取 ; Extention ClassLoader : 扩展加载 , 加载 /lib.../ext 下 , Java 中可以获取 , 其实现为 ExtClassLoader ; Application ClassLoader : 应用加载 , 加载开发者开发 , Java 中可以通过..., 如果也无法加载 , 儿子再交给孙子去做 ; 双亲委派模式优点 : 避免了重复加载 : 如果某 Class 已经加载过了 , 通过该机制 , 可以 直接读取出已经加载 ; 安全性强 : 系统...无法 被替代 , 系统只能由 启动加载 Bootstrap ClassLoader 加载 , 应用加载 加载被篡改 Java 核心是无效 ;

84130

Java加载

原文:Class Loaders in Java by baeldung 翻译:陈同学 可以参考笔者另一篇译文 深入JVM内幕 中装载部分 加载简介 Class loaders属于JRE一部分...在本教程中,我们将聊聊几种不同内置class loaders,它们如何工作以及如何创建自定义class loader。...启动加载(Bootstrap Class Loader) Javajava.lang.ClassLoader 实例进行加载,不过,class loader本身也是Java,那么 java.lang.ClassLoader...然而,有些场景并不是从本机硬件设备或网络上加载,因此我们需要自定义class loader来处理。 在本小节,我们将介绍自定义加载一些场景,也会介绍如何创建一个自定义加载。...在加载具有相同类名、包名字节码时实现版本控制机制,可以通过URL加载(通过URL加载jar)或自定义加载。 还有很多自定义加载可以派上用场例子。

73820

Java加载种类

加载java中,一个加载到JVM后,同一个就不会被再次加载了。那么如何标识一个是否被加载呢?...在Java中,一个加载到JVM中有一个唯一标识————全限定名(包名+名)。 但在JVM中,一个用其全限定名和其加载作为其唯一标识。...JVM预定义有三种加载,当 JVM启动时候,Java开始使用如下三种加载: 根加载(bootstrap class loader) 它用来加载 Java 核心,是用原生代码来实现,并不继承自...扩展加载(extensions class loader) 它负责加载JRE扩展目录,lib/ext或者由java.ext.dirs系统属性指定目录中JAR包。...系统加载(system class loader) 被称为系统(也称为应用)加载,它负责在JVM启动时加载来自Java命令-classpath选项、java.class.path系统属性,或者

3200

深入理解Java加载机制-加载

加载作为加载第一个阶段,是开放,它允许Java程序员通过自定义加载加载特定。 对于任意一个Java,都需要加载加载和这个本身确定唯一性。...jar包文件进行加载,并且只有文件名可被虚拟机识别(例如rt.jar)加载到虚拟机内存中。...1.2 扩展加载 扩展加载由sun.misc.Lanuncher$ExtClassLoader实现,负责加载/lib/ext目录或被系统变量java.ext.dirs所指定路径中所有库...双亲委派机制 有了以上三种加载和我们自定义加载,那么我们该如何搭配使用他们呢? 在Java中并没有一些强制性约束,但是双亲委派机制是Java设计者推荐给开发者一种加载器使用方式。 ?...这种机制好处就是:假设有人恶意编写了一个和Java包名名一模一样(这里假设是java.lang.Object),由于加载请求会被传递到启动加载中尝试加载,当启动加载尝试加载时候实际是加载

34820

Java加载机制与Tomcat加载架构

Java加载机制 加载 虚拟机设计团队把加载阶段中“通过一个全限定名来获取描述此类二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要...并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合库即使放在lib目录中也不会被加载加载到虚拟机内存中。...双亲委派模型一次“被破坏”是由这个模型自身缺陷所导致,双亲委派很好地解决了各个加载基础统一问题(越基础由越上层加载进行加载)并防止重复加载,基础之所以称为“基础”,是因为它们总是作为被用户代码调用...这就是双亲委派模型局限性了,父级加载无法加载子级加载路径中。那么,这个问题如何解决呢?...现在,就以Tomcat容器为例,看一看Tomcat具体是如何规划用户库结构和加载

35530

Java 加载解析及常见加载问题

加载层次结构 每当启动新 JVM 时,引导加载(bootstrap classloader)负责首先将关键 Java (来自 Java.lang 包)和其他运行时加载到内存中。...Java EE 委托模型 下面是应用程序容器加载层次结构典型视图:容器本身有一个加载,每个 EAR 模块都有自己加载,每个 WAR 都有自己加载。...Java Servlet 规范建议 web 模块加载在委托给其父之前先在本地加载中查找——父加载只要求提供模块中找不到资源和。...我们必须弄清楚这些如何加载。让我们使用 -verbose:class 并找出如何加载与HelloServlet 和 Factory 相关 Util 。...关键是查看的确切加载位置,它们是如何到达那里,以及如何防止将来发生这种情况。 多个加载中存在相同类一个常见原因是,同一个库不同版本捆绑在不同位置,例如应用服务和 web 应用程序。

86330

浅谈Java加载

JDK 默认提供了3种ClassLoader: Bootstrp Classloader(启动加载) 由C++编写,它主要负责加载Java核心库: %JAVA_HOME%/jre/lib -Xbootclasspath...参数指定路径 %JAVA_HOME%/jre/classes中 需要注意是这个加载是虚拟机启动时初始化Java程序是无法使用 Extension ClassLoader(扩展加载)...加载加载扩展,扩展JVM库它主要负责加载以下库: %JAVA_HOME%/jre/lib/ext目录 java.ext.dirs系统变量指定路径中库 Application ClassLoader...(应用程序加载Java程序默认加载,主要负责加载classpath所指定库 除了以上3个加载,开发人员还可以根据自己需求自己定制实现加载 加载之间层次模型一般是这样:...当一个加载在接到加载请求时,首先将加载任务委托交给父加载,父加载又将加载任务向上委托,直到最顶层启动加载,如果父加载可以完成加载任务,就成功返回,如果不行就向下传递委托任务,

30810

深度分析:Java加载机制和加载

而init方法,中一个构造函数就对应一个init方法 4. 加载 加载负责加载所有的,其为所有被载入内存中生成一个java.lang.Class实例对象。...安装目录,下同)下,或被-Xbootclasspath参数指定路径中,并且能被虚拟机识别库(如rt.jar,所有的java....*开头均被Bootstrap ClassLoader加载)。启动加载是由C++实现,没有对应Java对象,因此在Java中只能用null代替。...双亲委派机制优势:采用双亲委派模式是好处是Java随着它加载一起具备了一种带有优先级层次关系,通过这种层级关可以避免重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader...其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer,通过双亲委托模式传递到启动加载,而启动加载在核心Java API

64820

Java加载

Java中把上述加载过程定义了一个模块叫做加载,目的是可以让用户自己决定如何加载一个加载虽然只是实现加载动作,但它在Java中起到作用却远远要比加载功能要重要多。...原因就是加载加载过程中,会有一些特殊特性来保证Java运行安全。例如,每一个加载,都有一个独立名称空间。...就是虚拟机会按照指定文件名来识别加载,例如rt.jar。如果名字不符合即使放到lib目录中启动加载也不会加载。...启动加载无法被Java程序直接引用,原因是启动加载是用C++语言实现。 扩展加载 扩展加载功能是加载JAVA_HOME/lib/ext目录下所有库。...因此 java.lang包是由启动加载加载,而java.lang.Virus是由自定义加载加载。所以这些类型不属于同一个运行时包。

50520

Java加载(用户自定义加载实现)

java加载主要分为如下几种: jvm提供加载加载:底层实现,主要加载java核心库(如:java.lang.*) 扩展加载:使用java代码实现,主要加载如:jre/lib/ext...(父加载为根加载) 系统加载(应用加载):使用java代码实现,加载classpath目录下。...(父加载为扩展加载) 用户自定义加载:去继承ClassLoader实现自定义加载加载负责将java字节码文件加载到虚拟机内存中也就是生命周期装载过程。...Red但Red却打印出由loader1加载,这是由于加载秉承是父委托机制loader2在创建时包装了loader1为其父加载,而loader1创建时由于调用是没有传入父加载构造方法...,因此它加载为系统加载

76161

java加载过程详解_java三个加载

朋友给我发了一道有意思题目,如下 为什么用.class方式加载和以Class.forName()方式加载结果不同呢,原因很简单,就是加载过程不同。...这就扯到基础理解上了,就是Java如何加载一个呢? 上图是我绘制整个Java加载过程。...首先是编译期,将Java源文件也就是敲好代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给加载,传输是刚转换好字节码文件,也可以是通过网络传输过来字节码文件...然后就是运行期,运行期一开始,加载初始化字节码文件,通过本地库来验证字节码文件正确性,然后交给JVM解释和即时编译,最后汇合给JVM内部Java运行系统,都ok了后传给PC操作系统,最后就是物理硬件层面...所以问题答案就有了 .class是JVM将装入内存,是在编译期间实现,而编译期间只是做了字节码转换,所以不执行静态块 而class.forName()除了将.class文件加载到jvm中之外

42230

加载加载过程

加载子系统作用 加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定文件标识。...使用魔数而不是扩展名来识别Class文件,主要是基于安全方面的考虑,因为文件扩展名可以随意更改。...除了信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分内存映射) 加载ClasLoader角色 class file存在于本地硬盘上...由于Java采用是懒加载策略,只有当我们需要用到这个时候才会去加载他  初始化阶段就是执行构造方法()过程。...此方法不需定义,是javac编译自动收集所有变量赋值动作和静态代码块中语句合并而来。 构造方法中指令按语句在源文件中出现顺序执行。 ()不同于构造

16130
领券