gpt4 book ai didi

groovy - 如何使 Groovy 方法真正受到保护

转载 作者:行者123 更新时间:2023-12-04 14:12:51 25 4
gpt4 key购买 nike

尝试在 groovy 中创建一个方法 protected :

package com.foo

class Foo {

protected def getSomething(){
}
}

这不起作用,因为默认情况下 groovy 使几乎所有内容都可见,所以我尝试使用 @PackageScope
package com.foo

import groovy.transform.PackageScope

@PacakgeScope
class Foo {

def getSomething(){
}
}

这种工作,但前提是调用者使用 @CompileStatic ...
   package com.bar

class Bar {

@CompileStatic
static void main(args){
def f = new Foo()
println f.getSomething()
}

以上抛出 IllegalAccessError ,很好,但没有 @CompileStatic ,不产生错误;不太好。我不能强制用户静态编译,所以有什么替代方法可以强制执行 protected方法?

来自 Groovy Documentation

Protected in Groovy has the same meaning as protected in Java, i.e. you can have friends in the same package and derived classes can also see protected members.



好的,如果 protected在 Groovy 中具有相同的含义,但没有强制执行,这不会削弱它的含义吗?也许我错过了什么,

最佳答案

简短的回答:Groovy 不强制执行可见性检查。

更长的答案
Protected 在 Java 中有一个含义,你肯定知道。我只为感兴趣的读者提及:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2

并不是说 Groovy 没有设置相同的修饰符。所以从 Java 来看,该成员将像在 Java 本身中一样受到保护。更重要的是,Groovy 不会在运行时(或编译时)执行可见性检查,甚至可能使用反射来强制可访问性。 Groovy 必须这样做,因为在 Groovy 中,访问成员的类通常是运行时之一。这意味着 Groovy 必须在运行时模拟可见性检查,但为此需要某种“调用源”,但在 Groovy 中并不总是可用,因为元对象协议(protocol)缺乏正确传输它的能力。

使用 @CompileStatic 事情是不同的。这里产生了对成员的直接访问。只有它应该已经编译失败,并且在运行时不会因 IllegalAccessError 而失败。

关于groovy - 如何使 Groovy 方法真正受到保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com