有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

awt为什么不推荐java getPeer调用?

我正试图找到获取重量级AWT面板背景窗口X ID代码的最佳方法。为什么是java。awt。组成部分getPeer命令列为不推荐使用的命令?是否涉及安全问题


共 (1) 个答案

  1. # 1 楼答案

    javadoc声明:

    As of JDK version 1.1, programs should not directly manipulate peers; replaced by boolean isDisplayable().

    这是一个设计问题,而不是安全问题

    所要解决的问题是,对等实现在不同平台之间的行为可能相当不同,事实上(至少在理论上)在不同版本的Java之间的行为也可能相当不同。因此,如果您的应用程序直接访问对等方,那么它很可能是不可移植的

    无论如何,长期以来,直接访问同龄人一直受到强烈反对。早在Java1.4.2中,{}包和类就没有在标准javadoc中被记录(至少是这样)。对等类的源代码如下所示:(Java6版本)

     * The peer interfaces are intended only for use in porting
     * the AWT. They are not intended for use by application
     * developers, and developers should not implement peers
     * nor invoke any of the peer methods directly on the peer
     * instances.
    

    事实上,从Java9开始,以前不推荐使用的getPeer()方法已经被删除。因此,如果您想要一个不应该使用getPeer()的有力理由,那是因为如果您使用它,您的代码将无法在Java9上工作

    现在,如果您真的需要访问Java9中的AWT对等点,您仍然可以使用反射来访问包privatepeer变量。但是,使用反射深入AWT实现的风险在于,您的代码可能在将来的版本中(再次)中断。事实上,Java维护人员正在逐步锁定对Java内部构件的反射访问。(我没有检查,但我怀疑在Java16中,此访问将被“JEP 396:默认情况下强封装JDK内部(JDK-8256299)”阻止)