java - 编译时间与运行时间依赖关系 - Java

标签 java runtime classpath compile-time

Java 中的编译时依赖和运行时依赖有什么区别? 和类路径有关,但是它们有什么区别呢?

最佳答案

  • 编译时依赖项:您需要 CLASSPATH 中的依赖项来编译您的工件。它们的产生是因为您对代码中硬编码的依赖项有某种“引用”,例如为某个类调用 new、扩展或实现某些东西(直接或间接)或方法调用使用直接 reference.method() 表示法。

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

虽然编译时依赖通常意味着运行时依赖,但您也可以只拥有编译时依赖。这是基于 Java 仅在第一次访问该类时链接类依赖项的事实,因此如果您在运行时从不访问特定类,因为代码路径从未被遍历,Java 将忽略该类及其依赖项。

这个例子

在 C.java 中(生成 C.class):

package dependencies;
public class C { }

在A.java中(生成A.class):

package dependencies;
public class A {
    public static class B {
        public String toString() {
            C c = new C();
            return c.toString();
        }
    }
    public static void main(String[] args) {
        if (args.length > 0) {
            B b = new B();
            System.out.println(b.toString());
        }
    }
}

在这种情况下,A 通过 BC 有编译时依赖,但它只会有运行时依赖如果在执行 java dependencies.A 时传递一些参数,则在 C 上,因为 JVM 只会尝试解决 BC 的依赖它开始执行B b = new B()。此功能允许您在运行时仅提供您在代码路径中使用的类的依赖关系,而忽略工件中其余类的依赖关系。

关于java - 编译时间与运行时间依赖关系 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270950/

相关文章:

java - BigDecimal除法问题

java - 如何在运行时设置 JTextField 的宽度?

java - 用Java执行外部程序

clojure - 在当前 .jar 文件中获取 Clojure 命名空间

unix 中的 java 类路径

maven - 在Maven中,如何输出正在使用的类路径?

Java递归: Determine how many numbers in an array is greater than index 1

java - 无法通过 java Runtime 或 ProcessBuilder 执行 mysql 命令

java - getClass()方法的使用

performance - R 与 Matlab : Explanation for speed difference for rnorm, qnorm 和 pnorm 函数