试图在groovy中创建一个方法protected:
package com.foo
class Foo {
protected def getSomething(){
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为groovy默认情况下几乎所有可见,所以我尝试使用 @PackageScope
package com.foo
import groovy.transform.PackageScope
@PacakgeScope
class Foo {
def getSomething(){
}
}
Run Code Online (Sandbox Code Playgroud)
这种工作,但只有当调用者使用@CompileStatic...
package com.bar
class Bar {
@CompileStatic
static void main(args){
def f = new Foo()
println f.getSomething()
}
Run Code Online (Sandbox Code Playgroud)
以上抛出IllegalAccessError,这很好,但没有@CompileStatic,没有产生错误; 不太好看.我无法强制用户静态编译,所以有没有其他protected方法来强制执行方法?
在Groovy中受保护与Java中受保护的含义相同,即您可以在同一个包中拥有朋友,派生类也可以看到受保护的成员.
好吧,如果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并不总是可用.
使用@CompileStatic的东西是不同的.这里可以直接访问该成员.只有它应该已经失败编译,并且在运行时不会因IllegalAccessError而失败.
| 归档时间: |
|
| 查看次数: |
4099 次 |
| 最近记录: |