如何动态地+有条件地调用类的方法?
(类最终不在类路径中)
假设我需要class NimbusLookAndFeel
,但是在某些系统上它不可用(即OpenJDK-6
)。
因此,我必须能够:
public static void setNimbusUI(final IMethod<UIDefaults> method)
throws UnsupportedLookAndFeelException {
// NimbusLookAndFeel may be now available
UIManager.setLookAndFeel(new NimbusLookAndFeel() {
@Override
public UIDefaults getDefaults() {
UIDefaults ret = super.getDefaults();
method.perform(ret);
return ret;
}
});
}
编辑:
现在,根据建议,我编辑了代码,以NoClassDefFoundError
使用try-catch 进行拦截。它失败。我不知道这是否是OpenJDK的错。我明白了InvocationTargetException
,是由引起的NoClassDefFoundError
。有趣的是,我无法捕捉到InvocationTargetException
:无论如何它都被抛出了。
EDIT2: :
原因发现:我包裹SwingUtilities.invokeAndWait(...)
周围的测试方法,那很invokeAndWait
调用抛出NoClassDefFoundError
时加载雨云失败。
EDIT3: :
任何人都可以请澄清哪里 NoClassDefFoundError
都可以发生?因为似乎总是调用方法,而不是使用不存在的类的实际方法。
了解它是可用的类(在运行时)
将用法放在try块中...
如果不是这种情况,请跳过整个过程
...,然后将catch块留空(代码有气味吗?!)。
如何设法覆盖动态加载的类的方法
请做到这一点,并确保满足编译时依赖性。您在这里混在一起。覆盖发生在编译时,而类加载是运行时的事情。
为了完整起见,需要时,运行时环境会动态加载您编写的每个类。
因此您的代码可能如下所示:
public static void setNimbusUI(final IMethod<UIDefaults> method)
throws UnsupportedLookAndFeelException {
try {
// NimbusLookAndFeel may be now available
UIManager.setLookAndFeel(new NimbusLookAndFeel() {
@Override
public UIDefaults getDefaults() {
final UIDefaults defaults = super.getDefaults();
method.perform(defaults);
return defaults;
}
});
} catch (NoClassDefFoundError e) {
throw new UnsupportedLookAndFeelException(e);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句