尝试在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
方法?
来自格罗维文档 http://groovy.codehaus.org/Differences+from+Java
Groovy 中的 protected 与 Java 中的 protected 含义相同,即
你可以在同一个包中拥有朋友,派生类也可以
请参阅受保护的成员。
Ok, if protected
在 Groovy 中具有相同的含义,但并未强制执行,这是否会削弱其含义?也许我错过了一些东西
简短的回答:Groovy 不强制执行可见性检查。
更长的答案
您肯定知道,Protected 在 Java 中的含义。我只为感兴趣的读者提及它:http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2
这并不是说 Groovy 没有设置相同的修饰符。所以从 Java 来看,成员将像 Java 本身一样受到保护。更重要的是,Groovy 不会在运行时(或编译时)执行可见性检查,甚至可能使用反射来强制可访问性。 Groovy 必须这样做,因为一般来说在 Groovy 中访问成员的类是运行时之一。这意味着 Groovy 必须在运行时模拟可见性检查,但为此需要某种“调用源”,但由于元对象协议缺乏正确传输它的能力,因此在 Groovy 中并不总是可用。
使用@CompileStatic 事情就不同了。这里产生了对成员的直接访问。只是它应该已经编译失败并且不会在运行时因 IllegalAccessError 失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)