我有一个JFrame对象,我需要在Mac OS X上支持两个JVM 1.5,在Windows上支持1.6。在Windows上,我需要使用setIconImages函数为应用程序设置多个图标大小,但此功能在1.5上不可用。是否可以使用反射在JFrame中调用此函数?
Application extends JFrame{
.
.
.
void init(){
//check version
//call setIconImages
}
}
答案 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来执行回退调用。