使用 JavaFX,有没有办法阻止 GUI 树中的节点获取对其父节点的引用?例如,鉴于这种结构
AnchorPane > BorderPane > Pane
我如何确定最后一个窗格不能通过调用 .getParent() 访问它的父 BorderPane?
我需要这个,因为我正在从不受信任的代码中加载“窗格”,并且不希望它与包含它的主窗口组件混淆。
使用 JavaFX,有没有办法阻止 GUI 树中的节点获取对其父节点的引用?例如,鉴于这种结构
AnchorPane > BorderPane > Pane
我如何确定最后一个窗格不能通过调用 .getParent() 访问它的父 BorderPane?
我需要这个,因为我正在从不受信任的代码中加载“窗格”,并且不希望它与包含它的主窗口组件混淆。
A solution is to insert an intermediate parent between your BorderPane
and the untrusted Pane
. This parent could blocks access to its own parent.
But, the methods getParent and parentProperty are final
, there is no standard way to prevent a node from accessing to its parent.
Others options could be to get your own copy or the jre allowing to override the *parent*
methods, or some hacky code based on reflection.
您可以使用 Java 代理 API ( https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Proxy.html )。这允许您围绕一个或多个实例安装安全管理器来监视方法调用(除其他外)。
您也可以使用 Thread.currentThread().getStackTrace() 来获取调用任何方法的人,还可以添加一个额外的节点。
另一个选项是 fork JavaFX 源(https://openjfx.io/)构建它直到它工作(最难最难!https://wiki.openjdk.java.net/display/OpenJFX/Building+OpenJFX)并制作一些补丁,所以你有自己的实现......在这种情况下,请记住使用 diff/patch 进行更改,以便您可以在较新发布的 openjfx 版本上快速重新应用更改。还要尝试自动化构建过程,否则你会卡在旧版本上。某些 Java 版本也可能存在集成问题。此外,您可能需要使用您的项目构建和部署多平台动态库:(
或者,也许您可以调整 JVM 以替换一些 .class 文件,而无需重新编译整个 JFX,但我不确定这是否可能。