我想知道是否有人知道为什么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;
}
答案 0 :(得分:9)
正如Oracle官方发布的帖子所述:Why Developers Should Not Write Programs That Call 'sun' Packages(感谢@greg-449提供此信息):
sun。*包不属于受支持的公共界面。
直接调用sun。*包的Java程序无法保证在所有兼容Java的平台上运行。实际上,即使在同一平台上的未来版本中,也不能保证这样的程序能够正常工作。
所以,你不应该首先依赖sun.swing.AccessibleMethod
课程。
更多信息:
作为问题的解决方案,您可以执行以下操作:
sun.swing.AccessibleMethod
创建自定义类。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实现没有您的代码所依赖的这些功能......