Java:如何动态重写类的方法(类最终不在类路径中)?

java.is.for.desktop:

如何动态地+有条件地调用类的方法?
(类最终不在类路径中)

假设我需要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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章