试图在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/

10-15 10:59