怎么把自己做的网站发布到网上,wordpress产品模块,宁波网站搜索优化,代理注册公司注意事项文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器#xff1f;4、双亲委派模型是什… 文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器4、双亲委派模型是什么5、如何判断两个类是否相等 总结 引言
在百度提前批面试中第一个章节的问题关于类加载的相关知识点忘得一干二净这里整理一下 主要是类加载的过程还有双亲委派模型 整理也是按照之前的惯例先是基本的知识点然后就是对应的面试题整理
类加载机制
知识点复习
类的生命周期
类的生命周期如下除了最后的使用和卸载其他的基本上都很重要 加载连接 验证准备解析 初始化使用卸载 特征 上述生命周期是按顺序开始但是并不是按顺序完成通常一个阶段执行的过程中调用和激活另外一个阶段 1、加载
类加载器主要完成三件事分别是 找到在哪里通过一个类的全限定名来获取定义此类的二进制字节流加载到方法区将字节流所代表的静态存储结构转化为方法区的运行时数据结构创造对象提供入口在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各种数据的访问入口 2、连接——验证
目的 检查Class字节流确保这个字节流是符合要求的不会有安全性问题 验证内容 文件格式验证版本号还有开头的符号元数据验证语义分析是否符合Java语言规范继承抽象类的类是否实现抽象方法等字节码验证语义分析数据流和控制流分析程序是否合法或者符合逻辑等符号引用验证对类中所引用的信息的匹配性校验常量池中的各种符号引用 根据符号引用描述的名字能否找到对应的类符号引用的对象是否可被当前类访问
从文件格式到语法规范再到所引用对象
3、连接——准备
目的 为类的**静态变量static修饰的**分配内存初始化为默认值如果使用了final修饰则会给初始值 注意 只给类变量分配内存不给实例变量分配内存使用final修饰的static变量会直接赋初始值不会默认值
4、连接——解析
目的 将常量池中符号引用替换为直接引用 符号引用 是一组符号来描述所引用的目标相当于是相对引用 直接引用 直接指向目标的指针、相对偏移量、或者一个能定位到目标的句柄。
5、初始化 目的 为类的静态变量赋初始值不同于之前的准备是给静态变量赋默认值 初始化方式 声明类变量指定初始值使用静态代码块指定初始值 步骤 如果这个类没有被加载或者连接则程序先加载和连接这个类如果该类的直接父类没有被初始化则先初始化其直接父类如果类中有这些初始化语句则系统依次执行这些初始化语句 类初始化的时机 只有当类主动使用的时候才会导致类的初始化具体时机如下 调用对应类的静态方法初始化某一个类的子类父类也会被初始化创建类的实例使用反射
类加载器和类加载机制
类加载器 类唯一性的确立 一个类必须由加载他的类加载器和这个类本身一块共同确立其唯一性 具体应用 同一个Class文件加载的对象可能调用getClass返回的都是同一个名字但是如果类的加载器不同instanceof返回的结果也是false
三个类加载器 启动类加载器 负责加载Java核心类库是所有类加载器的顶层使用本地代码实现依赖于操作系统的本地代码C或者C 无法通过Java代码直接获取到启动类加载器的实例 核心类库 运行时类库rt.jar基础类String、Object、System 扩展类加载器 负责加载标准扩展目录中的类和资源。使用Java代码实现可以获取对应对象了解 ClassLoader extClassLoader appClassLoader.getParent();System.out.println(Extension ClassLoader: extClassLoader);应用类加载器 是用户自定义类和第三方库的默认类加载器加载应用程序类路径下的类库
ClassLoader appClassLoader ClassLoader.getSystemClassLoader();
System.out.println(Application ClassLoader: appClassLoader);类加载机制——双亲委派模型 定义 如果一个类加载器的收到了类加载的请求首先不会尝试自己去加载这个类而是把这个请求委托给父类加载器去完成。 所有的类加载请求都应该传递到最顶层的启动类加载器中。 只有当父加载器反馈自己无法完成这个加载请求时子加载器才会尝试自己去完成加载
典型应用
能不能自定义类加载器加载String类 不行
面试题整理
1、类加载是什么 类加载就是把Class文件中的类信息加载到虚拟机中并形成可以被虚拟机使用的Java类型是类加载机制。 Java的运行期间动态加载和连接Java中类型的加载、连接和初始化是在运行期间完成的实现了Java的动态扩展性。 一个类从加载到虚拟机再到卸载需要经历如下流程 加载连接 验证准备解析 初始化使用卸载
2、类加载的过程是什么 加载 通过类的全限定名找到对应二进制字节流文件将二进制字节流文件中的类的静态存储结构加载到方法区中转为运行时数据。在堆区创建对应的Class对象作为访问类信息的入口 验证 检查字节流防止载入错误或者恶意的字节流文件导致JVM崩溃验证流程文本格式验证、符号引用验证、元数据验证、字节码验证等 准备 为类的静态变量分配内存并赋默认值或者常量final static修饰的 解析 将符号引用替换为直接引用能够直接指向引用对象句柄或者指针等 初始化 直到该阶段JVM才开始执行类中编写的代码根据程序员的编码对类的静态变量去赋值执行类构造方法中的clinit方法
3、有哪些类加载器
有三层类加载器
启动类加载器
在JVM启动时创建加载最核心的类如Object、String等使用本地代码由操作系统实现
扩展类加载器
扩展类加载器复杂加载一些扩展的系统类比如XML、加密、网络编程等功能类。
应用类加载器
系统类加载器是加载用户类路径上的类库直接在代码中使用如果没有自定义类加载器一般情况下默认类加载器就是应用类加载器。 自定义类加载器是通过继承ClassLoader并重写findclass实现的
4、双亲委派模型是什么 类加载器具有等级制度但不是继承关系分层但非继承以组合的方式复用父加载器的功能。 除了顶层的启动类加载器之外其余类加载器都要用自己的父加载器 具体原理 一个类加载器收到类加载请求不会自己去加载而是把请求委派给父加载器。以此类推最后所有请求都会到启动类加载器。只有当父类加载器无法完成式子类加载器才会去尝试加载
5、如何判断两个类是否相等
确定一个类需要类自身的信息还有对应的加载器共同确定唯一性。两个类只有由同一个类加载器加载才有比较意义 如果不是同一个类加载器加载即使来在同一个Class文件两个类也不相等。
总结
又攻克了一个难关好好背一下至少保证了以后在遇到类似的题目基本上都能过了今天本来是想看完垃圾回收机制的但是晚上腰太疼了就去推拿了然后出去吃了点东西回来的比较晚剩下两个半小时要把昨天的面经整理好的就不看垃圾回收机制了明天做个笔试应该也不会刷题了后续要出去旅游请假三天回来接着学