JVM(Java SE 11版本)加载类和接口

简介:

本文介绍了Java虚拟机(Java SE 11版本)加载类和接口。

加载类和接口

加载是指查找具有特定名称的类或接口类型的二进制形式的过程。典型的做法是,查找事先由Java编译器从源代码计算而来二进制表示,但也可能是通过动态计算。
二进制形式最终会构造成一个Class对象。

加载的精确语义在Java Java Machine Specification,Java SE 11 Edition的第5章中给出。在这里,我们从Java编程语言的角度概述了该过程。

类或接口的二进制格式通常是上面引用的Java虚拟机规范Java SE 11版中描述的类文件格式,但只要满足第13.1节中规定的要求,其他格式也是可能的。

类ClassLoader的方法defineClass可用于从类文件格式的二进制表示构造Class对象。

表现良好的类加载器维护这些性质:

  • 给定相同的名称,一个好的类加载器应该总是返回相同的类对象。
  • 如果类加载器L1将类C的加载委托给另一个加载器L2,那么对于作为直接超类或C的直接超接口出现的任何类型T,或作为C中的字段类型,或作为类型方法的正式参数或
    C中的构造函数,或者作为C,L1和L2中方法的返回类型应该返回相同的Class对象。

恶意类加载器可能违反这些性质。但是,它不能破坏类型系统的安全性,因为Java虚拟机可以防范这种情况。

有关这些问题的进一步讨论,请参阅Java虚拟机规范,Java SE 11版和Java虚拟机中的动态类加载,作者:Sheng Liang和Gilad Bracha,作为ACO SIGPLAN发布的OOPSLA '98会议录。通告,第33卷,第10期,1998年10月,第36-44页。Java编程语言设计的基本原则是运行时类型系统不能被用Java编程语言编写的代码破坏,即使是这样的实现也是如此。否则敏感的系统类如ClassLoader和SecurityManager。

加载过程

加载过程由类ClassLoader及其子类实现。

ClassLoader的不同子类可以实现不同的加载策略。特别地,类加载器可以缓存类和接口的二进制表示,基于预期的使用来预取它们,或者将一组相关的类加载在一起。
例如,如果找不到新编译的类,因为旧版本由类加载器缓存,这些活动可能对正在运行的应用程序不完全透明。但是,类加载器的责任是仅在程序中可能出现的情况下反映加载错误,而无需预取或组加载。

如果在类加载期间发生错误,那么将在程序中(直接或间接)使用该类型的任何点抛出类LinkichError的以下子类之一的实例:

  • ClassCircularityError:无法加载类或接口,因为它将是自己的超类或超接口(第8.1.4节,第9.1.3节,第13.4.4节)。
  • ClassFormatError:声称指定所请求的编译类或接口的二进制数据格式错误。
  • NoClassDefFoundError:相关类加载器无法找到所请求的类或接口的定义。

因为加载涉及新数据结构的分配,所以它可能会因OutOfMemoryError而失败。

参考引用

目录
相关文章
|
19天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
15 4
Java——接口的使用实例
|
4天前
|
Java 测试技术
Java接口的生产环境应用注意点
在Java生产环境中,合理使用接口对提升代码质量至关重要。设计接口时应遵循单一职责原则,采用清晰命名,并控制方法数量。默认方法应谨慎使用,避免与实现类产生冲突。通过版本化管理接口更新,确保向后兼容。实现接口时需明确行为,保持实现与接口分离,利用多态增强灵活性。关注性能影响,适当文档注释及充分测试确保接口稳定可靠。综合运用这些策略,可以显著提高系统的可扩展性和维护性。
|
4天前
|
Java
Java 接口的简化理解
Java 接口是一种强大的概念,用于定义方法签名而非具体实现,作为行为规范,强调功能而非实现细节。接口是特殊的引用类型,包含常量和方法签名。其特点包括:无实现方法体、支持多重继承、内置常量定义。通过示例展示了如何定义和实现接口,以及如何通过接口引用调用实现类的方法。接口的应用场景包括抽象化、插件架构和松耦合设计。从 Java 8 起,接口还支持默认方法和静态方法,进一步增强了其灵活性和扩展性。理解接口是 Java 编程的基础之一。
|
5天前
|
安全 Oracle Java
edge浏览器加载java插件
edge浏览器加载java插件
28 1
|
6天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
6天前
|
Java
|
13天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7
|
10天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
35 2
|
16天前
|
Oracle Java 关系型数据库
Java(TM) Platform SE binary 已停止工作”的解决方法
Java(TM) Platform SE binary 已停止工作”的解决方法
|
3月前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
56 10
下一篇
无影云桌面