Java 9将限制对私有API的任何访问。这意味着使用Reflection检索窗口hwnd的已知方法不再适用。
还有办法让他们?我问,因为我有一个库,提供用于操作任务栏的API(以Java9提供的类似方式)。 Java 9 API仍然适用于AWT,所以我希望我可以为Java 9和JavaFX设置项目。
我曾经只是调用私有方法,但这将停止工作。 任何解决方案都很受欢如果可以使用JNA或BridJ完成本机调用。
答案 0 :(得分:0)
一种方法是在JDK9之前对已经建议的solution到How can I get the window handle (hWnd) for a Stage in JavaFX?进行更改: -
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
注意/小计: 免责声明来自 JEP-261:Module System -
必须使用
--add-exports
和--add-opens
选项 关心。您可以使用它们来访问库的内部API 模块,甚至JDK本身,但你这样做需要您自担风险:如果 内部API被更改或删除,然后您的库或 申请将失败。