Java 关于编译时和运行时依赖关系及其解决方案的问题?

Java 关于编译时和运行时依赖关系及其解决方案的问题?,java,compiler-construction,javac,Java,Compiler Construction,Javac,我有以下问题: 一般来说:什么是编译时和运行时依赖关系 javac编译器如何进行编译时依赖项解析 VM如何执行运行时依赖项解析 我浏览了JLS和JVM中的“依赖性”,但没有找到任何东西。“依赖性”是比JVM更高级别的抽象。有很多依赖关系管理系统,比如和,但它们都运行在JVM之上,而不是作为JVM本身的一部分 在Java平台文档中可以找到“链接”;i、 例如,JVM如何使用类或接口的名称来定位加载程序其他部分所需的字节码。Java通过一种称为。类路径可以通过环境变量、构建系统或运行程序时的命令行进

我有以下问题:

  • 一般来说:什么是编译时和运行时依赖关系
  • javac
    编译器如何进行编译时依赖项解析
  • VM如何执行运行时依赖项解析
  • 我浏览了JLS和JVM中的“依赖性”,但没有找到任何东西。

    “依赖性”是比JVM更高级别的抽象。有很多依赖关系管理系统,比如和,但它们都运行在JVM之上,而不是作为JVM本身的一部分

    在Java平台文档中可以找到“链接”;i、 例如,JVM如何使用类或接口的名称来定位加载程序其他部分所需的字节码。Java通过一种称为。类路径可以通过环境变量、构建系统或运行程序时的命令行进行配置

    一般来说:什么是编译时和运行时依赖关系

    • 编译时依赖关系:编译工件需要
      类路径中的依赖关系。它们的产生是因为您对代码中硬编码的依赖项有某种“引用”,例如为某个类调用
      new
      ,扩展或实现某些内容(直接或间接),或者使用直接
      reference.method()
      符号进行方法调用

    • 运行时依赖项:运行工件需要
      类路径中的依赖项。它们的产生是因为您执行访问依赖项的代码(以硬编码方式或通过反射或其他方式)

    摘自:然而

    javac编译器如何进行编译时依赖项解析

    它查看类路径和源路径以找到必要的依赖项

    VM如何执行运行时依赖项解析

    JVM并不完全关心依赖项解析,AFAIK。 JVM所做的是在需要时从类路径加载类。 例如,当您的程序(如A类)第一次命中时:

    // in class A
    F x = new F(42);
    
    将加载类
    F

    如果找不到该类,则会出现ClassNotFoundException。如果您在编译
    A
    和执行之间更改了F类,并删除了
    F(int)
    构造函数,则会出现几个不同的异常