java - java编译成class为什么一定要指定classpath?

标签 java javac bytecode

据我了解,每个单独的 java 类都是从单个 java 文件编译为单个类文件的。 (至少只要不涉及内部类。)

javac 需要访问引用的类以生成类文件是否有任何技术原因?

它只是为了检查给定的方法调用是否确实有效,或者是否真的有来自引用类的一些信息需要集成到生成的类文件中?

您能举个例子吗,其中 javac 需要根据引用类的内容生成不同的字节码?

关于这个主题有什么好的文档吗?

最佳答案

这是一个有点主观的问题,但我喜欢它。

如您所写,一个重要原因是及早发现错误。如果编译器没有依赖类的类文件供引用,它必须假设每个外部引用都是正确的。这些中的任何错误只能在运行时检测到。你不想要这个。

虽然这里有漏洞。依赖类可以在以后更改。由于这个原因和其他原因,运行时可用的类定义可能与编译时使用的类定义不同,从而导致运行时错误。

但我们拥有的比其他选择更好。

在某些情况下,引用类中的元素被集成到当前编译单元中,例如“常量”。考虑以下两个类:

// File A1.java
class A1 {
    static final String s = "string"; // constant
    static String s2 = "string2"; // not constant
    static final int i = 5;  // constant
}

// File A2.java
class A2 {
    public static void main(String args[]) {
        System.out.println("A1.s: " + A1.s);
        System.out.println("A1.s2: " + A1.s2);
        System.out.println("A1.i: " + A1.i );
    }
}

编译这两个,然后研究 javap -c -l -private A2 的输出并注意以下几点:

  • 对 A1.s 和 A1.i 的引用包括实际值
  • 如果删除对 A1.s2 的引用,则可以执行 java A2 即使 A1.class 被删除

关于java - java编译成class为什么一定要指定classpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306777/

相关文章:

java - Java 编译时交集有用吗?

java - 拦截构造函数导致 ClassNotFoundException

java - 在 java.sql.Date 中设置 October 14 ,1582 失败

java - 在 Windows 中从命令行执行 java 程序失败

java - 全局初始化控件在不同方法中变为空

java - 配置 Maven 使用 javac -O

java - JVM类型签名的方法类型是什么

java - 独立字节码 validator

java - 无法从 Eclipse 中的另一个包访问类文件

javascript - 如何防止编译jar插件出错