类加载:编译时或运行时



java类是在编译时加载还是在运行时加载?我知道您可以使用自己的类加载器或调用Class.forName("fully qualified name of java file")来动态加载java类。

但是,如果我没有使用上述任何技术,那么这是否意味着Java类是在编译时加载的?

否。JLS解释了加载和链接是如何在运行时进行的。类的任何二进制兼容修订版都可以代替现有类抛出。

类是使用对其他类的符号引用编译的,而不是使用这些类的代码。

然而,对于某些非JVM编译器,如GCJ类,可以提前编译为一个可执行文件。

类在运行时加载以执行它们的代码。

类在编译时加载,以使用类检查代码的类型安全性
无论何时编写使用类的代码(例如,调用类上的方法),编译器都需要加载该类来理解代码(例如检查方法或基类型)

编译时不加载任何内容。在编译时,类只是从源代码中生成的。

区别可能是,如果类是在JVM通电时由ClassLoader加载的,或者是在执行过程中动态加载的,但它们是同一块奖牌的两面。

在这两种情况下,它们都是动态加载的,但在前者中,JVM一启动就会加载。

正如许多其他人所说,类是在运行时加载的,除非您使用AOT编译器允许它们在非JVM环境中运行。如果您想了解Java虚拟机如何启动、初始化和加载第一个类以及随后的类的所有详细信息,您可以查看Java SE 7规范。

最新更新