试图在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
在Groovy中具有相同的含义,但没有这样强制执行,这是否会削弱其含义?也许我想念一些东西, 最佳答案
简短的答案:Groovy不执行可见性检查。
更长的答案
您肯定知道Java中的Protected含义。我只为有兴趣的读者提到它:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2
不是Groovy没有设置相同的修饰符。因此从Java来看,该成员将像Java本身一样受到保护。更重要的是,Groovy在运行时(或编译时)不执行可见性检查,甚至可能使用反射来强制进行可访问性。 Groovy必须这样做,因为通常在Groovy中,访问成员的类是运行时之一。这意味着Groovy必须在运行时模拟可见性检查,但是对于这种“调用源”是必需的,但由于元对象协议(protocol)缺乏正确传输它的能力,因此在Groovy中并不总是可用。
使用@CompileStatic的情况有所不同。在这里可以直接访问该成员。只有它应该已经编译失败,并且在运行时不会出现IllegalAccessError失败。
关于groovy - 如何使Groovy方法真正受到保护,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24581927/