Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类加载:编译时或运行时_Java_Runtime - Fatal编程技术网

Java 类加载:编译时或运行时

Java 类加载:编译时或运行时,java,runtime,Java,Runtime,java类是在编译时还是运行时加载的?我知道您可以使用自己的类加载器或调用class.forName(“java文件的完全限定名”)动态加载java类 但是,如果我没有使用上述任何技术,那么这是否意味着Java类在编译时加载?在编译时没有加载任何内容。在编译时,类只是从源代码生成的 区别可能在于当JVM通电时类由ClassLoader加载,或者在执行过程中动态加载,但它们是同一个类的两面 在这两种情况下,它们都是动态加载的,但在前者中,这是在JVM启动时立即完成的。否。说明了加载和链接是如何在运

java类是在编译时还是运行时加载的?我知道您可以使用自己的类加载器或调用
class.forName(“java文件的完全限定名”)
动态加载java类


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

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

区别可能在于当JVM通电时类由
ClassLoader
加载,或者在执行过程中动态加载,但它们是同一个类的两面

在这两种情况下,它们都是动态加载的,但在前者中,这是在JVM启动时立即完成的。

否。说明了加载和链接是如何在运行时完成的。可以抛出类的任何二进制兼容版本来代替现有类

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


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

类在运行时加载以执行其代码

类在编译时加载,以使用类检查代码的类型安全性。

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

正如许多其他人所述,类在运行时加载,除非您使用AOT编译器允许它们在非JVM环境中运行。如果您想阅读Java虚拟机如何启动、初始化和加载第一个类以及随后的类的所有详细信息,您可以查看运行时。它们在编译时会有什么好处?如果你感兴趣的话,可以提供关于类加载的详细信息。。我同意当有人问我一个问题时我很惊讶:编译时和运行时类加载Hi hexafraction/Jack有什么区别,因为SLacks类加载也发生在编译时。但我认为在类文件的编译时,仅保留依赖项的引用,并且在需要时在运行时加载类。@user1841293:什么意思?Hi SLaks,根据您的注释,类加载在编译时进行,也是为了类型安全,在运行时加载类以执行代码。如果我错了,请纠正我?嗨,SLaks,我还有一个疑问。假设有一个包含静态块的类a。现在,如果我写A=null,静态块将不会被执行,但是如果我写A=new A(),那么静态块将被执行,即类被加载。这是否意味着类加载发生在运行时。@user1841293:您的问题不清楚/没有意义。如果在运行时加载该类,它将在运行时加载。正如SLaks所指出的,类将在编译时加载,以检查使用该类的代码的类型安全性。例如,如果您实现java.lang.Runnable,编译器要求覆盖public void run(),并且编译器在查看类Runnable后知道这一点。@Alexei KaigorodovBut假设存在包含静态块的类a。现在,如果我写A=null,静态块将不会被执行,但是如果我写A=new A(),那么静态块将被执行,即类被加载。这是否意味着类加载发生在运行时。如果您正在访问编译时常量,那么在这种情况下类根本不会被加载。我反对“在编译时没有加载任何内容”这句话。当然,JVM在运行时加载类,没有人否认这一点。@AlexeiKaigorodov:在编译时,没有JVM就不能加载任何东西。类型检查器必须检查类的签名这一事实与类加载本身的概念没有任何关系,它可以只读取接口而不必考虑其他任何事情,它们根本不是一回事。这纯粹是术语问题。通过加载,我指的是读取和解析类文件。JVM规范本身在两种意义上使用“加载”:完全加载,由Classloader.loadClass()完成,以及读取和解析(完全加载的第一阶段,其他阶段是链接和初始化,参见第5章)。编译器和jvm的读取和解析是密切相关的(它们必须相互符合),并且可以使用相同的程序库来完成。