Java类加载器是否保证不加载未使用的类?

Joo*_*kka 12 java classloader

是否保证(默认的,系统)Java类加载器不会尝试加载正在运行的代码中未引用的类?我的意思是几个例子:

  • 我正在使用framework.jar我知道的包含对其他library.jar类的引用,但我只使用不包含这些引用的框架的这一部分.遗漏是否安全library.jar
  • 首次加载类时会运行静态块.如果没有正在运行的代码包含对特定类的引用,是否确定它的静态块没有运行?

快速测试它看起来像上面假设的那样工作,无论如何加载未使用的类没有多大意义,但是有什么保证吗?

另外:似乎我的"静态块在第一次加载类时运行"上面的语句有些不正确.绝对可以加载类(一件事)而不运行它们(另一件事).所以我对这两种情况都感兴趣; 保证类没有加载,而不是运行.

Ste*_*n C 8

有没有这样的保证1 WRT类的加载.

但是,您可以保证静态块不会过早运行.触发类初始化的事件在JLS 12.4.1中指定.

类或接口类型T将在第一次出现以下任何一个之前立即初始化:

  • T是一个类,并且创建了T的实例.
  • T是一个类,并且调用由T声明的静态方法.
  • 分配由T声明的静态字段.
  • 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
  • T是顶级类,并且执行在词典内嵌套在T中的断言语句(第14.10节).

1 - 据观察,当前生成的Java实现不会不必要地加载类,但这不是保证.唯一的保证是它在官方规范中所写的内容.