粉丝1716获赞5676
什么是内加载器?内加载器有哪些呢?我们知道一个类,它被加载到虚拟机内存, 直到他卸载内存,他的生命周期包括加载,包括验证,包括连接啊,就是包括准备,包括解析、初始化、使用和卸载,你看到他这些过程比较复杂对不对?所以整个内加载的过程虽然说非常繁杂,这个活很累,但是总得有人干嘛, 那就谁干内加载器来干内加载器就是干以上的五个步骤,加载、验证、准备、解析和初始化。 那么像我们经常使用的扎外程序内加载器有哪些呢?最顶层的就是 boot drop 内加载器啊,这个是加载器中的扛把子啊,任 任何的类的加载行为都要经过它,它的功能呢就是加载核心的内裤,比如说 ot 点赞啊,比如说 resource 点赞,比如说等等之类的啊,这个加载器呢,要注意了,它不是招霸器的,它是 c 加加语言写的,它随着 g e m 的启动而启动。 然后呢还有第二个内加载器叫做 extension class lord, 这个是拓展内加载器啊,它主要是加在我们 g d k 中 library, 然后杠啊,就是啊杠 e x t 目录下面的一些炸包,这是一些拓展包 啊,然后的话呢,他同时是继承继承于 u r l 这个克拉斯罗的。然后第三种呢,就是我们默认的这种应用程序啊,不是可以选克拉斯罗的,我们也可以叫他 sister class low, 他主要是加载我们的 class pass 底下所有的炸和 clus, 就是我们写的业务代码啊,我们首先呢会用这个类价的去进行加载啊,除此之外的话呢,你还可以自己写 自定义的类似加加载器啊,然后呢去支持一些个性的拓展,比如说加密啊,比如说一些其他的处理啊。所以这就是我们刚才讲的什么是类加载器,它主要呢是干内加载的这些 火,对不对?然后内加载器主要有哪些啊? body strap education application, 还有 cast 我们自定义的这些。
加瓦类加载器有哪些?那么在加瓦中啊,有哪些类加载器?有的呢还会问这个类加载器各自的这个加载路径啊?这个呢,当然呢,这个问题呢,其实是一道比较呃,就是进行的题目啊。就是,当然呢也好查的也是你这个知识面,因为平常呢我们很少会用到啊。嗯,但是呢, 在一些特殊的这个业务场景下面可能呢也会使用到,当然也要看你啊这个工作内容,是吧,是写了这个呃,普通的这 这个业务代码了,还是写这框架代码?那么如果我们写一些比较复杂的这种框架代码的话,那么这个内加载器呢,往往就会接触的比较多啊, 我们来看一下这个加瓦中呢有哪些这个内加载器。首先呢,这个 jdk 呢,自带的有三个类加载器,一个叫做呢布的是追捕克拉斯 logo, 这个叫做顶级的顶层的这个内加载器,一个叫做 esd 克拉斯 logo, 还有一个叫做 abb 克拉斯。 那么我们来看一下他各自的这个加载路径啊,以及呢有什么样的特点啊?这个拨的是追捕克拉斯 logo 呢,他是这个 exd 克拉斯 logo 的负累加载器。大家注意一下,这个所所所说的这个负累并不是直接的这个继承关系啊,不是继承关系,他是通过什么呢?通过一个,在这个 exd 克拉斯 logo 里边有一个 part 属性,然后呢这个属性是或者是追捕克拉斯的啊,他并不是说啊,并不是直接的一个继承关系啊,并不是直接的继承关系。 然后呢,这个拨的是最普啊,当然我们这整个内家的其实都是这样的啊,他他所谓的这个啊负类指的都是他里边的,比如说我们这个 app, 对吧?这个 ust 了, 是这个 a b p 的一个负累加载器,其实都是通过一个派人的变量去维护的,他不是一个继承关系啊,那么这个拨的是最补这个顶级负负加载器,那么他的 默认加载的路径呢,其实就是我们的加挖控,我们一般呢都会到我们的这个黄金边料里面去设一个加挖控吗?对吧?那么这个加挖控下面的这个立不包下面的这个架包克可拉斯文件就是他的一个加载路径,那么这下面的文件呢,就会被他加载,那么不在这个路径下面呢,他就不会加载啊, 这里面呢通常呢都是我们的,比如说我们的阿 t 点架啊,就是我们的 gdk 提供的这个工具工具库啊,那么呢一般呢都是由他来加载的啊啊,然后呢第二个加载器往下就是我们的这个扩展内加载器啊,叫做 est 克拉斯 logo, 就是扩展内加载器, 他加载的呢是加挖空下面这个利布目录下面的一个叫做 ext 文件下的架包可克拉斯类啊,去扩展类加载器好,那么最最核心的跟我们程序员就是关系最近的一个类加载器的,叫做 abb 克拉斯 logo, 这个 abb 格拉斯 logo 呢,他加载的呢?是 啊,克拉斯 pass 下面的这个内文件啊,也就是了这个克拉斯 pass, 其实说白了就是除害了上面两个,对吧?就是除害了这个加挖空下面的这些包,以及了这个 ust 下面的包,对吧?我们谁需要自己写的代码以及呢?我们引入的这些驾包依赖的这些驾包,那么这些呢,都是由这个 abb 可拉斯 logo 了他来负责加载的,那么这个 app 可拉斯 logo 呢?在我们这个加法中,他是默认的系统的加载器啊,默认的系统的加载器,注意一下,这里面呢, 他呢是一个,他呢是自定义类加载器的一个负类,他是自定义类加载器的负类啊,我们如果想要自定义一个类加载器的话,我们需要呢去继承这个克拉斯 logo, 然后呢去实现这个自定义类加载器, 那么在这里面呢,你可以呢?要要。呃,如果想要符合这个双金尾派,就是我们想要符合这个加瓦本身的这个内加载机制的话,那么 你需要把你的这个拍软的呢,指定为这个 abb 格拉斯 logo 啊,那么这样才能够按照我们加瓦本身的这个内加载机制去进行这个内加载。好,那么这里呢还要提到一个点的就是这个 abb 格拉斯 logo 了,它不仅仅是系统类加载器啊,这里呢是系统类加载器, 他了还是一个什么了?还是一个系统内加载器啊,还是一个了上下文现成上下文加载器啊, 现成上下文加载器,系统类加载器呢?很好理解,对吧?其实就是帮助我们加载我们的这个程序员的代码以及的这个克拉斯 pass 啊,就是我们可以很方便的通过这个啊, c 斯坦克拉斯 过来了,就直接盖了 cston 克拉斯漏的去获取啊。那么这个现成上下文加载器他又是怎么理解了?我们来看一个,就呃画一个简图 啊,比如说我们之前讲了这里呢有三层内加载器,对不对?有三层内加载器啊?那么 这个呢?是最顶层的这个布的是追捕类加载器,这个呢是 est, 这个是 app, 对吧?然后后面呢还有我们自定义的,那么这个现成类加载器呢?他的意思就是说这个这个 app 啊,他其实是贯穿于这三个类加载器的,那么这每一个类加载器呢?都可以去访问他,都可以去访问他啊, 这个就叫做现成上下文加载器啊。好,那么这个呢,以上的就是这个加网,就是有哪些内加载器以及呢 这些内加载器各自的加载路径是什么?以及包括我们怎么样去实现我们这个自定义的一个内加载器啊?
这期讲一下某组知识扩展,与整合包和游戏本身内容没有多大关系,推荐式了解一下。 先,如果你要安装的 mode 有很多,我推荐是下载几个就试着运行一下能不能成功加载,不然等到你下载了十几二十多个 mode, 然后一起安装,发现运行失败再来找问题就会很麻烦。毕竟有时候一些 mode 是有冲突的,单个装没事,一起装就有事。 其次,冒的重复安装也会导致运行失败,还是拿饰品栏冒的距离。比如你要玩的 mod 需要饰品栏,但是由于文件是英文名称,你并不知道自己已经安装了,于是把一个从命名过的饰品栏帽的放了进来,这就是重复安装了。 这个时候运行游戏的话,一般会提示你猫的重复加载,删掉其中一个就行了,但有时候是没提示的。这时候再想象一下如果你的猫的是文件夹里有十几二十几个猫的之前 情况,想想就头大了。为了避免这种情况的出现,我推荐是在帽的崇明明的时候遵循一个规则,还是拿饰品栏帽的举例,一般帽的文件名都由三个部分组成,帽的名称对应的 mc 版本号,帽的自身的版本号,比如都是饰品栏,但是这两个文件对应的 mc 版本和自身的版本都不一样。 还有一些帽的因为使用的加载器不同,也会在文件名上写着对应的帽的加载器。所以如果要给帽的文件重名名的话,建议不要直接改成中文,而是添加上这个帽的对应的中文名就行,就像这样看起来是不是就一目了然了。 接着再讲讲整合包,比如你要把你玩的 mod 的和地图分享给你朋友,你难道要给朋友发个 mod 的列表,然后告诉他游戏版本的信息,让你朋友自己下载吗?这肯定不实际,所以整个包这东西就出现了,说白了 就是整合游戏的内容,并打包,让别人拿到这个包就能玩了。能整合的内容包括但不限于游戏的版本和地图、观影和材质,还有最重要的模组,在启动器里也有制作整合包的功能。拿这些我很早以前和朋友一起玩的,冒得住例子, 你只需要把游戏的帽子和各种东西安装好,确认游戏能正常运行之后,在其中期的版本列表里选择对应的版本,导出整合包就行。需要对整合包信息进行一些试纸,不懂的话直接下一步就行。 接着选择保存的指定路径并命名文件,然后根据你的需求来选择要整合的内容,一般都直接下一步就行,之后把导出的整合包发给别人。那么拿到整合包的人要怎么用呢?那肯定还是要用到启动器,不过先不要急着打开启动器,推荐安装整合包之前先新建个文件夹,文件名 称是作为对应整合包名称,防止自己忘记,然后把一个启动器放进去,这时候再打开启动器,在版本列表里选择导入整合包。选择整合包文件安装成功后,照常登录,就可以直接玩到别人整合的游戏了,是不是感觉很方便?但是我个人并不喜欢启动器导入的整合包, 为什么呢?打开点麦克尔福文件夹,你会发现是不是少了什么东西? modet 和其他文件夹呢?这个问题可以在导入的游戏版本设置里找到答案,可以看到启动器自动给你的整合包进行了文件隔离。游戏文件都在 versus 对应的版本里就很不习惯,我看着烦, 而且没有启动器的人拿到整合包也用不了。虽然启动器打包的时候可以附带启动器打包,但是这样的话等于是把游戏打包一层之后再加上启动器再打包一层。别人拿到整合包之后要 首动解开一层。拿到启动器和真实的游戏整合包之后才能用启动器导入,这不麻烦吗? 所以我一般都不会使用启动器的导出导入整合包的功能,而是用普方法手动压缩文件制作整合包。这个要求你对游戏文件有足够的了解,不懂的话还是老使用启动器吧。还是拿这些游戏文件做例子,在你了解游戏各个文件夹的作用之后,直接把没必要的文件删了, 因为并不需要给别人存档,也没有光影和材质,所以这三个文件夹可以删了。而 ss 和 librarys 这两个我虽然在下载篇说过是游戏资源文件删了就无法启动游戏, 但是别人在启动游戏的时候,启动器会把这些文件下载回来,所以也可以删掉。这里只留下 versions 和 mode 的是文件夹,然后回到上一集目录,直接把点麦 craft 文件夹和启动器选中,打包压缩,记得别 带上 hmco。 点接审之前说过这个是保存启动器配置文件的,就没必要给别人了,这种方式制作的整合包没办法用启动器导入,而是直接解压,然后打开启动器正常登录就可以运行了。 期间如果提示下载失败之类的,你就看看什么东西下载失败。这里写着 oppot fine, 那就手动吧, opt fine 安装一下就行了,相对来讲是不是更方便? 可以看到两种整合包打开后的内容是不一样的,所以今后你自己下来整合包,最好是看一下里面的文件,这样就知道能不能用形容器导入。总的来说,整合包这方面需要你对游戏文件有足够的认识,多操作几次就熟练了。 如果你想玩别人的整合包,启动器也有整合包下载功能,可以参考更详细的可以去 mc 百科下载整合包都会有整合包相对应的介绍。 最后提一句,我这里只介绍整合包是什么概念与基础操作。关于整合包中的问题,请自觉不要问我,我不可能专门把整合包玩一遍来回答你的问题。那么本期视频到此结束,拜拜!
加瓦类加载器有哪些?那么在加瓦中啊,有哪些类加载器?有的呢,还会问这个类加载器各自的这个加载路径啊。这个呢,当然呢,这个问题呢,其实是一道比较,呃,就是进行的题目啊。就是。当然呢,也好查的也是你这个知识面,因为平常呢,我们很少会用到啊。呃,但是呢, 在一些特殊的这个业务场景下面,可能也会使用到。当然也要看你啊这个工作内容是吧,是写了这个呃,普通的这 这个业务代码呢,还是写这框架代码。那么如果我们写一些比较复杂的这种框架代码的话,那么这个内加载器呢,往往就会接触的比较多啊。 我们来看一下这个加瓦中呢有哪些这个内加载器。首先呢,这个 j d k 呢,自带的有三个内加载器,一个叫做呢 bool 是 j 不克拉斯 low 的,这个叫做顶级的顶层的这个内加载器,一个叫做 e s d 可拉斯 logo, 还有一个叫做 a b b 克拉斯。 那么我们来看一下它各自的这个加载路径啊,以及呢有什么样的特点啊?这个不的是追不可拉斯 logo 了,它是这个 ext 克拉斯 logo 的负累加载器。大家注意一下,这个所所所说的这个负累并不是直接的这个继承关系啊,不是继承关系,它是通过什么呢?通过一个,在这个 ext 克拉斯 logo 里边有一个 parent 属性。然后呢,这个属性是或者是追不可拉收的啊,他并不是说啊,并不是直接的一个继承关系啊,并不是直接的继承关系。 然后呢,这个播的是巨谱啊。当然我们这整个类价的其实都是这样的啊,那他所谓的这个啊负类指的都是他里边的,比如说我们这个 app 对吧?这个 e s t 了, 是这个 app 的一个负累加载器,其实都是通过一个派人的变量去维护的,它不是一个继承关系啊。那么这个 body 是最补这个顶级负负加载器。那么它的 默认加载的路径呢?其实就是我们的加挖控。我们一般呢都会到我们的这个环境变量里面去设一个加挖控吗?对吧?那么这个加挖控下面的这个力不包下面的这个架包克克拉斯文件,就是他的一个加载路径,那么这下面的文件呢,就会被他加载,那么不在这个路径下面呢,他就不会加载啊。 这里面的通常呢都是我们的。比如说我们的 rt 点价啊,就是我们的 gdk 提供的这个工具工具库啊。那么呢一般呢都是由他来加载的啊啊。然后呢,第二个加载器往下就是我们的这个扩展内加载器啊,叫做 est 克拉斯 logo, 就是扩展内加载器, 他加载的呢是加挖控下面这个力部部落下面的一个叫做 e x t 文件下的架包,可克拉斯类啊,去扩展内加载器好。那么最最核心的跟我们程序员就是关系最近的一个类加载器呢,叫做 app 克拉斯 lode, 这个 abb 克拉斯 lodo 呢,他加载的呢?是 啊,克拉斯 pass 下面的这个类文件啊,也就是了这个克拉斯 pass。 其实说白了就是除害了上面两个对吧?就是除害了这个加挖控下面的这些包,以及了这个 e s t 下面的包对吧,我们才选自己写的代码,以及呢我们引入的这些价包,依赖的这些价包。那么这些呢都是由这个 app 格拉斯 lod 了,他来负责加载的。那么这个 app 格拉斯 lod 呢?在我们这个加瓦中,他是默认的系统内加载器啊,默认的系统内加载器。那注意下,这里面呢 他呢是一个,他呢是自定义内加载器的一个负累,他是自定义内加载器的负累啊。我们如果想要自定义一个内加载器的话,我们需要去继承这个克拉斯 lodo, 然后呢去实现这个自定义内加载器。 那么在这里面呢,你可以说要要呃,如果想要符合这个双金尾派,就是我们想要符合这个加瓦本身的这个内加载机制的话,那么 你需要把你的这个拍软的呢,指定为这个 abb 克拉斯 lodo 啊。那么这样才能够按照我们佳娃本身的这个内加载机制去进行这个内加载。好。那么这里呢还要提到一个点的,就是这个 abb 克拉斯喽的了,他不仅仅是系统内加载器啊。这里呢是系统内加载器 他呢?还是一个什么呢?还是一个系统类加载器啊,还是一个呢?上下文现成上下文加载器啊, 现成上下纹加载器。系统类加载器呢?很好理解对吧,其实就是帮助我们加载我们的这个程序员的代码,以及的这个克拉斯 pass 啊。就是呢,我们可以很方便的通过这个啊 sister 克拉斯 来了就直接 get cctrl 去获取啊。那么这个县城上下文加载器他又是怎么理解了?我们来看一个呃,画一个简 啊。比如说我们之前讲了这里呢,有三层内加载器对不对?有三层内加载器啊,那么 这个呢是最顶层的,这个不是追捕类加载器,这个呢是 ext, 这个是 app 对吧?然后后面呢还有我们自定义的那么这个现成内加载器呢,他的意思就是说这个这个 app 啊,他其实是贯穿于这三个类加载器的。那么这每一个类加载器呢?都可以去访问他,都可以去访问他啊, 这个就叫做现成上下纹加载器啊。好,那么这个呢?以上呢就是这个加瓦就是有哪些内加载器,以及呢 这些内加载器各自的加载路径是什么?以及包括我们怎么样去实现我们这个自定义的一个内加载器啊。
说下类加载器机,治愈双氢伪派 jar 类加载器机制是 jar 用于加载类文件到内存中的一个核心机制。它采用了一种层级结构和双氢伪派模型,确保了类的唯一性和安全性。 类加载机制是类加载器,负责将类文件加载到 g v m 的内存中,使得类可以被实力化和调用。 内加的气按照层级结构组织形成了一个内加的气数。每一个内加的气负责加在特定范围的内,通常分为以下几种内加的气。第一种, 引导内加的气,它是 g u m 的一部分,用于加载 java 的核心内裤,通常位于 g r e lab r t 点 架中扩展类加载器,负责加载 g r e lab ext 目录下的架包应用程序类加载器也称为系统类加载器,负责加载应用程序 class pass 下的类。 还有呢?自定义内架的器,用户可以根据需求创建自己的一个内架的器, 以加载特定位置或方式的类文件。双清尾派模型是内加载器机制的一个核心概念之一, 他规定了类加载器在尝试加载类时,首先为配给负类加载器进行尝试。 只有在副类加载器无法加载时,才有子类加载器尝试进行加载。这个模型的目的呢,是确保类的唯一性和安全性。 即便是不同的类加载器加载相同的类,他们也会被视为不同的类,因为每一个类加载器都有自己的类命名空间。 双金尾派模型可以防止系统内裤被篡改或替换,因为即使有人尝试加载一个与系统内裤同名的内,他也不会覆盖系统的内裤。
加瓦,程序员一定要知道一个类的加载和初始化的详细全过程,今天我就来讲一下这个内容比较干,记得点赞收藏。好,我们开讲。首先来看一道面试题,我有这么一个类, a 类里面有一个静态代码块打印出 a, 然后呢,我有一个 b 类,继承了 a 类,它里面也有这么一个静态代码块打印出 b, 然后呢,我们 new 一个 b, 首先我们 new 一个 b, 他会打印出什么呢?那肯定是打印出 ab, 对吧?我们运行一下看了吗?他会先打印出 a, 再打印出 b, 那么接下来我们加一个东西, 在六 b 之前,我们先来六一个 a, 那么此时他会打印出什么呢?好,我运行一下, 哎,看到了吗?他还是打印出 a 和 b, 这是为什么呢?有人知道吗? 我 a 里面打印出 ab, 里面打印出 bb, 继承了 a, 然后呢,我直接扭一个 b, 他打印出是 ab, 我先扭一个 a, 再扭一个 b, 他打印出的还是 ab, 这是为什么呢?这就涉及到累的加载的问题。好,接下来我们上干货。 首先呢,一个类加载的全过程,它分为三个阶段,一个呢是类的加载,一个呢是类的链接, 最后一个呢是类的初始化。好,我们一个一个来看。首先呢,我们要知道啊,当程序主动使用某个类时,如果这个类还没有被加载到内存中,这个 gbm 会进行加载链接和初始化。这个重点就在这啊, 就是你这个类还没有加载到内存当中,他才会去进行加载啊,如果你已经加载到内存当中了,那就不会再进行加载了,所以说这就解释了我们刚才这个现象, 你直接扭一个 b 的话,他这个负累 a 还没有加载进来,所以说他会加载一次,并且会初始换一次,所以会执行这个代码。但是如果你首先上来就把 a 给扭了, 那么 a 他已经下载技能了,所以说你在你有 b 的时候,这个 a 就不会再加载了,所以说他两个 打出的结果是一样的啊。好,我们具体来看一下这三个步骤。首先第一个步骤是类的加载,这个加载指的就是说把 java 的 class 文件加载到内存中,并且为之创建一个 java 浪点 class 对象, 那么这个加载呢,是由类加载器完成的,类加载器呢,一般由 j v m 提供,但是我们开发者也可以通过继承 class loader 这个类来实现自己的类加载器。 jvm 呢,会通过类的全新的名,就是包名和类名来找到这个克拉斯文件啊,当他把这个文件读到内存中以后,他会放在方法区。我们都知道加瓦八以后呢,把方法去给取消, 是用一个圆空间来代替的,所以说在加二八以后,他会把这个放到这个圆空间当中啊。好,第二个,第二个步骤就是类的链接,这个链接不太好理解啊,但是他又可以细分为三个阶段,一个叫验证,一个叫准备,一个叫解析。 验证阶段呢,就是说验证你这个类这个字写码文件符不符合加法规范的要求,有没有什么问题可以简简这么简单的理解 再给你准备阶段。准备阶段呢, gvm 会为类的静态变量分配内存,并为其设置初始默认值,这个也很好理解啊,在准备阶段呢,如果我们这个类当中有些静态变量,对吧?他会为他开辟内存空间,并且给他付一个默认值, 比如说 inter 类型的,他会负默认值为零,他对象类型他会负为一个闹啊。第三阶段是解析,这个解析是什么意思呢?他是将类或接口的符号引用转化为直接引用,这是什么意思呢? 他这个阶段呢,他会把我们这个类当中的一些常量的饮用直接变成地址,这个简单聊两下就可以啊。 最后一个阶段,类的初始化,这也是个非常重要的阶段,这个阶段呢,是真正执行类中定义的加码程序代码,比如说我们的静态单八块 静态变量。那么这个初始化的顺序呢?他是遵循类的继承关系的,先初始化副类,再初始化此类。好,我们这个类的加载呢?就这么点内容,有什么问题?评论区讨论。
阿里面试题, tomk 的为什么要这样设计内加的机制?首先我们看一下 tomk 的内加的机制是什么样子,哎,是这个样子, 上面这三个是我们 gvm 的内加热器,下面几个就是我们脱不开的内加热器,他为什么这样设计啊?首先我们分别看一下脱不开的这几个内加热器的一个作用,首先抠门式内加热器 好,我们打开一个通不开的,我这里分别有五六七八九几个版本,他们是有区别的。首先看最早这个版本五点五,那五点五这个打开之后呢,它里面有个 coomen, 那么这个就是 comelax 内加起去加彩 好,然后呢,我们这有个开的那个内加压器,他加的什么呢?加在我们搜索下的啊文件,你看这里边有内部,内部有假包。好。 然后呢,我们这个线的内夹线他家在什么呢?他家在我们这个线的哎,里面有夹包啊,这个是抠的,你可以往里面放夹包。好,这是我们这 三个内架器。那外部 app 加载什么呢?他加载我们这个外部 app 下的哎,部署这个项目是这么个结构。好,那么这个是我们哎通不开的五的版本,那如果是六的话,七的话,八的话怎么样呢?六的话他是这个样子, 没有 comis 也没有这个谢尔的啊,没有说法,那么他的所有家宝都在内蒙公路上,那么这个时呢,我们通不开的其实就是只有一个 comax 那家亲, 那么这两个呢?虽然存在,但是你需要单独配置,并且创建相应的补贴夹,然后让他去加载啊,所以我们现在已经简化了,从六以后啊,都 都是这个结构啊,就 comax, 然后这两个相遇没有了啊,需要单独配置才可以使用,但外部 app 还是有的,因为他要加载外部 app 的项目啊,这个结构。这六,那我们看七,你看都是这个结构。 都这个结构啊,那八也是一样啊,看八,对吧?也是这个结构。好,包括九都是这个结构。那这是我们脱不开的内 内加载器结构。那最下面这个呢? gsp, gsp 的话呢,就是加载我们的 gsp 文件。好,这是我们通不开的内加载器的一个结构。那为什么要这样设计呢?
今天我们来分享一道关于加瓦类加载方面的面试题啊。在国内的一二线互联网公司面试的时候,面试官通常是使用这一方面的问题来暖场的,但结果往往是造成冷场。 比如啊,什么是双亲伟派?什么是内加载? nose, dream 生成了几个对象等等。双亲伟派的英文呢?是 parent 得力给一些 model。 我认为啊,从真正的实现逻辑来看,正确的翻译应该是负委托模型。当然不管他叫什么,我们来先看看遇到这个问题的时候应该怎么去回答呢?不断的回答, 嗯。什么是双亲伟派?呃,双亲伟派呢?是是那个,呃, gm 在实现那个内加载的时候啊,呃,他会是叫多个内加载器啊,比如说像内个其中内加载器啊,或者呃扩展内加载器啊,还有是 那个应用加载器,然后他们这种加载器之间会有一个这种成绩关系嘛。然后呃,就我们要去加载一个类的时候,他所有的加载他应该是会给到, 给到那个就是附加载器来执行,就是最终,嗯,会往上去传递,然后最终当每一个内架器去,他会去检查嘛?去检查那个,呃,就是每一个 就这个类是不是我,我的那个加热器应该是加载的,如果,呃如果不是的话,就他会继续又又又往下发去给到,去给到那个,嗯,那个持家的继续加载 啊。对高手的回答。关于这个问题呢,需要从几个方面来回答,首先啊, 我简单说一下类的加载这样一个机制,就说我们自己写的加文文件到最终运行,他必须要经过编译和类加载这两个阶段,而编译的过程就是把点加文文件编音成点 class 文件,而类的加载过程就是把点 class 文件 加载到 g v m 的内存里面,装载完成以后会得到一个 class 对象,我们就可以使用六关键字来实力化这个对象。而内的加载过程需要涉及到内加载器。 gm 在运行的时候会产生三个内加载器,这三个内加载器呢,组成了一个层级关系, 每一个类加热器分别去加载不同作用范围的加包。比如说像 bliss trap class loader, 它主要是负责加往核心内裤的加载,也就是 gda home 下面 libe 下面的一个 r t 点价和 resource 点价等等。 extension class loader 呢,主要是负责 gda home 下面的 libe ext 目录下的一个价包 和 class 文件 app。 新 classlow 的主要是负责当前应用里面 classpass 下面的所有架包和类文件。除了系统自己提供的类加热器以外,还可以通过 class low 的类来实现制定一家的器去满足一些特殊的场景需求。 而所谓的副委托模型呢,就是按照内加载器的层级关系逐层进行尾派,比如说当我们需要加载一个 class 文件的时候,首先会去把这个 class 文件的查询和加载尾派给副加载器去执行。如果副加载器都无法加载,那么再尝试自己的加载这样一个 class, 那么这样是你的好处呢?我认为有两个啊,第一个是安全性,因为这种成绩关系实际上代表的是一种优先级,也就是说所有的类加载优先要给到 bootstrap closs low 的。那么对于核心内裤中的一些类呢,就没有办法被破坏,比如说自己写一个家外 点浪点子俊最终还是会交给启动类加热器,再加上每个类加载器的本质的一个作用范围,那么自己写的加了点浪点子俊就没有办法去覆盖内裤中的类。第二个啊,我认为这种层级关系的设计呢,可以避免重复加载导致程序混乱的一些问题, 因为如果负加的器已经加载过了,那么只加的器就没有必要再去加载了。以上呢,就是我对这个问题理解。 gvm 训练机呢,一定是面试必问的一个领域,因为我们自己写的程序就是运行在 gvm 上,一旦出现问题,你不理解就无法去排查。就像一个汽车修理工人,他不知道汽车工作原理,不懂发动机,那么他也无法去做好这份工作。 好的,本期的普通人 vs 高手的面试系列视频就到这结束了,喜欢的朋友记得点赞和收藏。我是 mike, 一个工作了十四年的家务程序员,咱们下期再见。
那下面我们看下内加载器的流程,我们内加载器流程他分为三个阶段,分别是加载链接图实化,或者说我们也可以说成加载验证、准备解析和初始化。那我们内加载器他有什么作用? 我们内加载器根据内的全名来查找内文件,将内文件加载到我们的内存中。内加载器可以根据不同的数量来查找文件,那比如说我们的文件系统,还有我们从我们的网络,或者从我们的价文件中去查找 我们 class 文件,在我们的文件开头都有一个特定的文件标识,我们的 class loader, 它只负责我们 class 文件的加载, 至于说他是否可以运行,由我们的执行引擎去决定。我们加载内信息呢?都存放在我们的方法区中,那么除了内信息以外,我们方法区中他还会存放我们运行时长的值信息。那我们再看一下我们加载器, 我们这里是不是有三个加载器,第一个是我们的引导类加载器,第二是我们扩展类加载器,第三个是我们的应用类加载器。其实在我们 gvm 规范中,他只分了两种加载器, 第一种是我们的引导类加载器,它是由我们 c c a 加写的。那另外一种是我们的自定义加载器,它是由我们 java 代码写的继承实现我们的 class load 类,那比如说我们的 e 叉 d class loader 和我们的 a p p class loader。 好,那下面我们看一下我们 a p p class loader, 好,看到我们的 a p p class loader, 它这里是不是继承了我们的 url class loader? 好,我们往里看, 我们再往里看,我们看到这里它是不是继承了我们的一个 class load 类?好,那再看到我们的 e 叉 t class loader, 我们 e 叉 t class loader, 它是不是也就 继承了我们的 url class noder? 好玩,你看它这里是不是也继承了我们的一个 class noder? 那这就是我们所说的一个自定义加载器。 那接下来到我们的链接阶段,那我们链接阶段有三个步骤,第一个是我们的验证,在我们加载内时,我们内加载器会对内进行验证,去验证一下我们刚刚加载的 class 文件是不是正确的,他不可能随便一个 class 文件我们都把它处理,他会去验证我们 class 文件的格式与确保内文件的版本安全性和完整性。 在验证过程中他会检查文件是否有损坏、过时,或者存在我们安全漏洞。那验证完之后是不是到了我们的准备阶段?比方说我们在内里面定义了一个 start 修饰的一个变量 inter 类型,比如说我们 a 等于一,那么在准备借贷,它会给它附上一个默认值零。如果说我们这里 是不能类型的话,那它这里就是 force, 那什么时候复制为一呢?那就在我们初始化的时候。但是这里我们要注意,我们这里不包括 fina 修饰的 static, 因为我们 fina 被变异的时候就会被分配, 他不会为实力变量分配初始化,因为我们内变量分配到方法区中,而实力变量随着对象一起分配到我们的 java 堆中。那验证完了,就到了我们一个解析阶段,好,看到我们解析阶段,他将长的时钟的符号引用,也就是当前的名字直接转换成直接引用, 也就是我们的内克拉斯对象地址,那这个就是我们链接的三个步骤,那这三个步骤做完之后,就到了我们的初始化阶段。那比如说我们刚刚是不是定了一个 study 的修? 是一个边亮?是不是他是 inter 类型的,他的默认值为一,那在这里他就会给他复制为一,那在准备环节是不是给他复制为零呢? 那么在我们初始化环节这里就给他一个初始值,那看你到底有没有给他初始值。我们之前是不是定义了初始值为一,那他这里是不是就是一?好,那这是我们内加载器的一个流程。
java 字解码文件是如何加载到 j b m 的呢?类的加载过程解析? hello, 大家好,我是架构师奶爸。一个类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括加载 loading 验证 verification 准备 preparation 解析 resolution 初始化 initialization 使用 using 和卸载 unloading 七个阶段,如上图所示。 在 java 虚拟机中,类加载的全过程包括加载验证准备解析和初始化这五个阶段所执行的具体动作, 这些都是有类加载器来实现的,下面具体分析一下。一加载加载是类加载过程的一个阶段,首先来一个简单的代码打印以及创 建一个 hello 对象,如上图所示,运行之前设置 xxt race class loading, 如上图所示,运行结果如上图所示。截取后面部分可以看到 calm jvm load, class load 先被加载,然后是 calm jvm c l s hello class load 是这个 me 方法的主类,所以优先加载。 hello 的加载是在实力化的时候,也就是被用到的时候。如果读者自己去断点,那就更直观的看到了上面这个图,可以看到输出了类的权限定名 类加载器就是通过这个来获取它的二进制字节流,这个二进制字节流来源如下,一 class 文件 to zip jar war 包中读取三网络中读取,比 如 applet 四运行时计算生成,比如动态代理技术五,由其他文件生成,比如 j s p。 二验证阶段验证是为了确保 class 文件的字节流中包含的信息符合当前虚拟机的要求, 并且不会危害虚拟机自身的安全。当加载的 class 文件不符合虚拟机的要求, java 虚拟机是无法执行这个字解码的,所以要先看看有没有符合, 符合了才给虚拟机执行后续操作。三、准备准备是正式为类变量分配内存 并设置类变量初始值的阶段。也就是说, come j v m load class load 和 come j v m c l s hello 在虚拟机中的内存分配是在这个阶段,这时候进行内存分配的仅 包括类变量被 static 修饰的变量,而不包括实力变量。实力变量将会在对向实力化时随着对象一起分配。在扎巴堆中设置类变量初始值,通常情况下就是数据类型的零值。 四、解析解析是虚拟机将长量池内的符号引用替换为直接引用的过程,比如 com jvm load class load 编译的时候不知道 com jvm cls hello 的实际内存地址, 此时用符号引用。当 com j v m c l s hello 加载到内存后,此时就改为直接引用指向 hello 的内存位置。 五、初始化在准备阶段 value 零在初始化阶段 value 财富值为一百二十三、类初始化的条件一、 new 一个对象竟 态变量的复值和取值,静态方法的调用。二、通过反射机制调用。三、如果子类初始化的时候,副类未出始化。四、执行的主类没方法的时候。五、下面看看类虽然被加载,却没有初始化的例子。通过以上分析 可以看到 subclass 被加载了,但是并没有输出 subclass in it。 想了解更多 java 架构师岗位知识,请关注我,架构师奶爸共同筑基 java 架构师。
一天一道面试题,谈谈招吧的类加载器。招募类加载器招募 class loader 是招募虚拟机的一个重要组成部分,它的主要作用是将类的字解码加载到 g、 d、 m 中,并将其转换成运行时的招募对象。招募类加载器主要分为三种类型,一、 fruits drop classloader, 也称为引导类加载器,是 j、 b、 m 自带的类加载器,用来加载装了核心类库, 例如招了点亮点星号包中的泪,它是所有其他类加载器的副加载器,由 c 加加编写,无法被招了程序直接引用。二、 x d 胜 class loader 也称为扩展类加载器,用来加载招了扩展库, 例如 jobx 点信号包中的类,它是由章乐编写的类加载器是由 bootstrap class loader 加载的。三、 system class loader 也称为应用程序类加载器,用来加在应用程序中的类,例如 自己编写的类,它是由章乐编写的类加载器是由 extension class loader 加载的。除了这三种标准的类加载器之外,还可以自定义类加载器,也加载一些非标准的类库或者一些特殊的类。自定义类加载器需要继承 class loader 类,并实现 find class 方法,在该方法中指定类的字解码加载方式。 自定义类加载器的优点是可以灵活的控制类的加载方式,缺点是需要开发者自己保证类的唯一性和正确性。