为什么sun.swing.AccessibleMethod从JDK 8中消失了?

时间:2014-10-15 14:59:34

标签: java swing java-8 netbeans-platform

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

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;
}

2 个答案:

答案 0 :(得分:9)

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

  

sun。*包不属于受支持的公共界面。

     

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

所以,你不应该首先依赖sun.swing.AccessibleMethod课程。

更多信息:


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

答案 1 :(得分:5)

这个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实现没有您的代码所依赖的这些功能......