【问题标题】:Why sun.swing.AccessibleMethod is gone from JDK 8?为什么 sun.swing.AccessibleMethod 从 JDK 8 中消失了?
【发布时间】:2014-10-15 14:59:34
【问题描述】:

我想知道是否有人知道为什么 sun.swing.AccessibleMethod 从 JDK 8 中消失了,以及在 JDK 8 中是否有这个类的替代品? 我在任何地方都找不到任何相关信息。 我在自己的实现中使用这个类DropHandler。我使用sun.swing.AccessibleMethod 的代码 sn-p 如下所示:

private DropLocation getDropLocation(DropTargetEvent e)
{
    DropLocation dropLocation = null;
    if (this.component != null)
    {
        try
        {
            Point p = e instanceof DropTargetDragEvent ? ((DropTargetDragEvent)e).getLocation() : ((DropTargetDropEvent) e).getLocation();
            AccessibleMethod method = new AccessibleMethod(JComponent.class,
            "dropLocationForPoint",
            Point.class);

            dropLocation = (DropLocation) method.invokeNoChecked(this.component, p);
        }
        catch (NoSuchMethodException ex)
        {
            LOGGER.info(ex.getMessage());
        }
    }

    return dropLocation;
}

【问题讨论】:

  • 不知道为什么这个类在 JDK 8 中被删除了。不过,如果你读过the source code,它只是反射方法的一个包装器。您可以将此代码复制/粘贴到您的项目中的自定义类中,并使用此自定义类替换 sun.swing.AccessibleMethod
  • 感谢您的回答@LuiggiMendoza,是的,编写我自己的包装类是个好主意,但我希望有人知道为什么这个类被删除了,这很奇怪。

标签: java swing java-8 netbeans-platform


【解决方案1】:

正如 Oracle 官方帖子中所述:Why Developers Should Not Write Programs That Call 'sun' Packages(感谢 @greg-449 提供此信息):

sun.* 包不是受支持的公共接口的一部分。

不保证直接调用 sun.* 包的 Java 程序可以在所有 Java 兼容平台上运行。事实上,即使在同一平台上的未来版本中,也不能保证这样的程序可以正常工作。

所以,你一开始就不应该依赖 sun.swing.AccessibleMethod 类。

更多信息:


作为您的问题的解决方案,您可以执行以下操作:

【讨论】:

    【解决方案2】:

    这个AccessibleMethod 类有什么意义?

    以下使用自 Java 1.2 以来存在的标准 Java API:

    try {
        Method method = JComponent.class
                                  .getDeclaredMethod("dropLocationForPoint", Point.class);
        method.setAccessible(true);
        dropLocation = (DropLocation) method.invoke(this.component, p);
    } catch(NoSuchMethodException|IllegalAccessException|InvocationTargetException ex) {
        Logger.info(ex.getMessage());
    }
    

    但是,如果将来发生这种情况,请不要回来询问为什么 JComponent.dropLocationForPoint 已被删除。如果您正在访问非标准 API,您可能会遇到此类问题。确切地说,总是 Java 实现不具备您的代码所依赖的这些功能...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多