Java 类路径如何影响*.class文件

Java 类路径如何影响*.class文件,java,classpath,Java,Classpath,我有一些要编译的源代码文件。为此,我必须指定一个类路径,它包含(通过指定JAR)所有使用过的类和方法,并具有正确的签名 假设我有两个不同的类路径,它们都导致编译没有错误。这些类路径可能在JAR的顺序、JAR的版本(例如,旧版本的commons collections被新版本替换)或不必要的JAR的存在方面有所不同 这些类路径如何影响字节码?我了解到,对于不同的类路径,常量池的顺序可能不同。还有其他可能的区别吗 再次:我假设编译的所有依赖关系都得到满足,但可能使用不同的JAR。编译时使用的类确实会

我有一些要编译的源代码文件。为此,我必须指定一个类路径,它包含(通过指定JAR)所有使用过的类和方法,并具有正确的签名

假设我有两个不同的类路径,它们都导致编译没有错误。这些类路径可能在JAR的顺序、JAR的版本(例如,旧版本的commons collections被新版本替换)或不必要的JAR的存在方面有所不同

这些类路径如何影响字节码?我了解到,对于不同的类路径,常量池的顺序可能不同。还有其他可能的区别吗


再次:我假设编译的所有依赖关系都得到满足,但可能使用不同的JAR。

编译时使用的类确实会影响生成的字节码。我知道受影响的地区:

  • static
    查找和调用静态方法的代码与常规(实例)方法的代码不同;如果使用不兼容版本的库运行代码,这可能会导致代码在运行时失败
  • 常量:如果将许多常量(整数、字符串等)声明为
    static
    final
    静态
    块外的常量值,则编译器会将它们内联;如果不同版本的依赖库为代码引用的常量定义了不同的值或类型,那么代码的字节码中将具有不同的值

恐怕它们根本不会影响字节码。当字节码运行时,由于加载顺序,类路径很重要。所有字节码都是加载程序试图从运行时类路径解析的FQN。@DaveNewton如果您的代码有一些表达式,如
double x=1.0+LibraryClass.LIBRARY\u常量。假设一个版本的
LibraryClass
LIBRARY\u常量定义为
int
,但另一个版本将其定义为
double
?强制转换操作不会产生不同的字节码吗?或者这也是运行时的事情吗?@MadPhysicast如果它是在声明中初始化的最终静态常量,那么它将是不同的字节码,例如,如果它是在静态块中初始化的,或者是用非常量初始化器初始化的,那么不是。@DaveNewton。因此,从技术上讲,类路径可能会影响编译:)@madpysicast是的,我同意你的观点?声明
静态final
是不够的,它们还必须(a)用常量值初始化,并且(b)不在静态块中初始化。那么常量池的顺序呢(参见我的问题)?它是否会受到CLAPATH的影响?根据定义,常量基本上是静态的和最终的。如果它不是
final
,则它是可变的,而不是常量。明确地记下这些修饰符关键字并没有什么坏处。@JFMeier我不知道常量池的顺序。因为我既不编写编译器,也不编写虚拟机,所以我从来没有关心过这一点。我想顺序可能因编译器而异。