我想打包一段绝对可以的代码must在 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();
}
拥有这个的最简单的方法是什么compile1.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 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 并迭代返回的列表(如果您的方法可用)。这也不是很快。
EDIT:Christopher Oezbek 在评论中建议仅检查该方法是否存在一次并保存结果以避免 Try-catch-block 的开销。这是正确的,也是一个很好的解决方案。 matt b 警告,Java 编译器的目标选项不会检查所使用的类和方法是否在 Java 1.5 下可用。没错(否则它将无法工作,因为您想要针对 1.6 方法进行编译),这意味着应该在 1.5-VM 下仔细测试该程序,以避免出现此问题。感谢你们两位的评论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)