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

试图在groovy中创建一个方法

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,就不会产生错误;不太好看.我无法强制用户静态编译,那么是否有任何替代方法来强制执行受保护的方法

来自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.

好吧,如果受保护在Groovy中具有相同的含义但是没有强制执行,那是否会侵蚀它的含义?也许我错过了什么,

解决方法

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

更长的答案
受保护在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而失败.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...