据我了解,每个单独的 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/