gpt4 book ai didi

java - 合规模式和覆盖方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:17 25 4
gpt4 key购买 nike

我对合规模式有疑问。我的类会发生什么,它扩展了一个基本的 java 类,例如 Properties 并使用 JDK5 编译并打包到一个 jar 中。现在我在一个使用 JDK 6 构建但处于合规模式 5 的项目中使用这个 jar。有人现在可以在我的 JDK6 项目类中使用新方法 stringPropertyNames() - 这是 JDK6 中的新方法吗?

最佳答案

它可以工作,只要您在 JRE 6 JVM 上运行您的项目。并且您不需要编译符合 Java 1.5 的项目。也就是说,在编译您的项目时,您不需要使用 -source 1.5-target 1.5 选项。

另一方面,当您在 JRE 5 JVM 上运行项目时,它会失败

java.lang.NoSuchMethodError:B.stringPropertyNames()Ljava/util/Set;

无论编译项目时使用的选项如何。

在运行时发生的事情是,JVM 为 Properties.stringPropertyNames() 搜索相应的执行字节码。当在 JRE 6 上运行时,这样的代码存在(无论在编译中使用了什么选项)。在 JRE 5 上运行时,它不存在。

我检查了你建议的场景:

B.java:

public class B extends Properties {

public B() {
setProperty("a", "aaa");
setProperty("b", "bbb");
}
}

C.java:

public class C {

public static void main(String[] args) {
B b = new B();
System.out.println(b.stringPropertyNames());
}
}

以下输出结果相同,使用 JDK 6 编译,使用 -source 1.5 和/或 -target 1.5 或不使用。

JVM 6 上的输出:

[b, a]

JVM 5 上的输出:

Exception in thread "main" java.lang.NoSuchMethodError: B.stringPropertyNames()Ljava/util/Set;
at C.main(C.java:17)

那么,为什么要在编译时使用 -source-target 呢?

This site简明扼要地解释说,如果使用晚于指定版本的某些功能,您可以使用 -source 选项使编译器失败。例如,-source 1.4 确保您不使用泛型(否则它只会在运行时失败)。

-target 选项是根据 official docs ,用于启用在其他(早期)JVM 上执行编译后的代码。例如,如果我使用 JDK 6 来编译我的代码,但我需要它在 JVM 5 上运行,我会在编译时使用 -target 5。如果我不这样做,我将得到 java.lang.UnsupportedClassVersionError: Bad version number in .class file

我希望您不会被答案淹没 ;)...

关于java - 合规模式和覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9113125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com