gpt4 book ai didi

Java:打包 Java 1.5 和 1.6 代码的最简单方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:03 28 4
gpt4 key购买 nike

我想打包一段绝对必须在 Java 1.5 上运行的代码。如果 VM 是 1.6 VM,则代码的一部分可以“增强”程序。

基本上就是这个方法:

 private long[] findDeadlockedThreads() {
// JDK 1.5 only supports the findMonitorDeadlockedThreads()
// method, so you need to comment out the following three lines
if (mbean.isSynchronizerUsageSupported())
return mbean.findDeadlockedThreads();
else
return mbean.findMonitorDeadlockedThreads();
}

在 1.5 上编译并且在 1.6 上执行 1.6 方法调用的最简单方法是什么?

在过去,我通过编译一个独特的 1.6 类来完成类似的事情,我会将其与我的应用程序打包在一起,并在 1.6 时使用 ClassLoader 实例化(因为 1.6 JVM 可以完美地混合 0x32 和 0x31 类),但我认为这有点矫枉过正(而且有点痛苦,因为在构建过程中你必须同时构建 0x31 和 0x32 .class 文件)。

如果想在1.5上编译上面的方法应该怎么走?也许使用反射,但是如何使用(我对反射一点都不熟悉)

注意:如果你好奇的话,上面的方法来自这篇文章:http://www.javaspecialists.eu/archive/Issue130.html

(但我不想像文章中那样“注释三行”,我希望它在 1.5 和 1.6 上都能编译运行)

最佳答案

你不能在 1.5 上编译它,但你可以在 1.6 上编译,将目标选项设置为 1.5(这将为 1.5 生成字节码)并在代码中使用反射来确定该方法是否可用。

此代码将查找方法: mbean.getClass().getMethod("findDeadlockedThreads", new Class[0]);问题是,如果该方法不存在,它会抛出一个 NoSuchMethodException,而不是简单地返回 null 或类似的东西。这意味着,您需要这样的代码:

try
{
mbean.getClass().getMethod("findDeadlockedThreads", new Class<?>[0]);
return mbean.findDeadlockedThreads();
}
catch(NoSuchMethodException ex)
{
return mbean.findMonitorDeadlockedThreads();
}

这不是很好,因为它使用异常来做出决定。那可能不是很快。另一种方法是改用 getMethods 并在您的方法可用时迭代返回的列表。这也不是很快。

编辑: Christopher Oezbek 在评论中建议只检查一次方法是否存在并保存结果以避免 Try-catch-block 的开销。这是正确的,也是一个很好的解决方案。 matt b 警告说,如果使用的类和方法在 Java 1.5 下可用,则 Java 编译器的目标选项不会检查。没错(否则它不会工作,因为你想针对 1.6 方法进行编译)这意味着应该在 1.5-VM 下仔细测试程序,以避免这个问题。感谢你们两位的评论。

关于Java:打包 Java 1.5 和 1.6 代码的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2448614/

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