调用基于JVM版本的函数

时间:2009-12-05 03:16:14

标签: java reflection

我有一个JFrame对象,我需要在Mac OS X上支持两个JVM 1.5,在Windows上支持1.6。在Windows上,我需要使用setIconImages函数为应用程序设置多个图标大小,但此功能在1.5上不可用。是否可以使用反射在JFrame中调用此函数?

Application extends JFrame{
.
.
.
  void init(){
   //check version
   //call setIconImages 
  }

}

5 个答案:

答案 0 :(得分:2)

我会做类似以下的事情(不会编译,但应该让你开始):

创建一个名为FrameUtils的类,并为其提供以下方法:

public static void setIconImages(final java.awt.Window window, 
                                 final List<? extends Image> icons) 
{
    try
    {
        Method setIconImagesMethod;

        setIconImagesMethod = // use reflection to get the setIconImages method. 
        setIconImagesMethod.invoke(window, icons);
    }
    catch(final NoSuchMethodException ex)
    {
        // fall back to the single image method
        window.setIconImage(icons.get(0));
    }
}

This link shows you how to get the method and call it via reflection.

答案 1 :(得分:1)

由于你必须分别在两个版本的jdk上进行编译,可能最好的解决方案是为旧的jdk上没有工作的东西提供一个接口,并且有两个实现。然后在启动时加载您需要的实现。

答案 2 :(得分:0)

看起来java 1.5中的javax.swing.JFrame具有setIconImage()函数。为什么需要设置多个图像?

答案 3 :(得分:0)

是的,反思是实现这一目的的方法。

我在一些需要“后向可比性”的图书馆看到了这个技巧。二进制文件必须在较旧的VM上运行,因此必须通过反射访问较新的API。

答案 4 :(得分:0)

如果可以使用Java 1.6进行编译,可以通过捕获NoSuchMethodError来实现。以下是我的代码中的示例,它获取了任务栏的屏幕边界,但如果Java版本太早,则会回退到整个边界:

try {
    sb=wnd.getGraphicsConfiguration().getBounds();
    }
catch(NoSuchMethodError thr) {
    Dimension ss;
    ss=wnd.getToolkit().getScreenSize();
    sb=new Rectangle(0,0,ss.width,ss.height);
    }

如果需要使用反射(因为J6更改了类版本而你必须编译为J5),那么你只需要用反射提取J6方法,并捕获MethodNotFoundException来执行回退调用。