我要打包的一段代码即绝对必须上的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级类似的东西,我会打包带我的应用程序和使用的ClassLoader实例化时,在1.6(因为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”,新的等级[0])。 问题是,如果方法不存在,而不是简单地返回null或类似的东西,它抛出一个NoSuchMethodException。这意味着,你需要这样的代码:

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

这是不是很好,因为它使用的异常作出决定。这可能不是非常快。另一种方法是使用而不是和的getMethods迭代返回的列表,如果你的方法是可行的。这也是不是非常快。

修改克里斯托弗Oezbek表明评价,使该方法存在的检查只一次,并保存结果,以避免在try-catch块的开销。这是正确的和一个很好的解决方案。亚光b警告说,在Java编译器的目标选项不检查,如果使用的类和方法的Java 1.5下可用。这是正确的(否则它不会工作,因为要编译对1.6的方法),这意味着,该计划应在1.5-VM仔细测试,以避免这个问题。感谢您的意见你们俩。

其他提示

编译为1.5。

在您的代码中使用的反射。你可以从类接口的Method对象;它有一个invoke方法是把你的MBean实例作为参数。是这样的:

类C = mbean.getClass(); //也可以做YourClass.class得到这个

方法M = c.getMethod( “findMonitorDeadLockedThreads”); //或任何其它方法(参数 该方法与类指定...第二个参数getMethod)

m.invoke(的mbean)//调用方法与实例

当然,你不必每次都做;设置在一个构造函数,然后只调用对需求的正确的方法的引用。

Maven的,您可以使用配置文件做到这一点很容易地。曲线背后的想法是,你想建立的东西根据某些条件的两个不同版本的东西。在该具体示例中,可以定义一个jdk15jdk16轮廓,指定JDK版本来编译每个,并告诉它包括在jdk15轮廓的类的一个副本,而另一个在jdk16。

要开始,请参阅:

HTTP://unserializableone.blogspot的.com / 2008/09 /编译和测试与 - 不同-jdk.html

此描述了如何做的问题的不同的JDK版本的一部分。

要处理的问题的第二部分,使用视JDK的类版本不同的定义,请参阅本:

Maven的 - 包括在构建时

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top