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
注意/小鬼:免责声明中从 - 261:模块系统 -
--add-exports
和--add-opens
选项必须谨慎使用护理。您可以使用它们来访问库的内部API模块,甚至JDK本身,但您需要自行承担风险:If如果内部API被更改或删除,那么您的库或