Java 9 将限制对私有 API 的任何访问。这意味着使用反射检索窗口 hwnd 的已知方法将不再起作用。
还有办法得到它们吗?我问是因为我有一个库,它提供了一个用于操作任务栏的 API(以类似于Java9提供的方式)。Java 9 API 仍然适用于 AWT,所以我希望我可以为 Java 9 和 JavaFX 设置我的项目。
我以前只调用私有方法,但这将停止工作。任何解决方案表示赞赏。如果可以使用 JNA 或 BridJ 完成本机调用,则可以。
一种方法可能是更改已经建议的解决方案 如何在 JavaFX 中获取舞台的窗口句柄 (hWnd)?在 JDK9 之前有用:-
try {
TKStage tkStage = stage.impl_getPeer();
Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow" );
getPlatformWindow.setAccessible(true);
Object platformWindow = getPlatformWindow.invoke(tkStage);
Method getNativeHandle = platformWindow.getClass().getMethod( "getNativeHandle" );
getNativeHandle.setAccessible(true);
Object nativeHandle = getNativeHandle.invoke(platformWindow);
return new Pointer((Long) nativeHandle);
} catch (Throwable e) {
System.err.println("Error getting Window Pointer");
return null;
}
有点module-info.java
像:
module your.module {
requires javafx.graphics;
}
但是由于javax.graphics
在内部将包导出到特定模块,如下所示:
exports com.sun.javafx.tk to
javafx.controls,
javafx.deploy,
javafx.media,
javafx.swing,
javafx.web;
您可以尝试添加编译器选项以仍将其用作
--add-exports javax.graphics/com.sun.javafx.tk=your.module
Note/Imp :免责声明JEP-261:Module System -
和选项必须非常小心地使用
--add-exports
。--add-opens
您可以使用它们来访问库模块甚至 JDK 本身的内部 API,但这样做的风险由您自己承担:如果该内部 API 被更改或删除,那么您的库或应用程序将失败。