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

标签 groovy

尝试在 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 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.



好的,如果 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 中并不总是可用,因为元对象协议(protocol)缺乏正确传输它的能力。

使用 @CompileStatic 事情是不同的。这里产生了对成员的直接访问。只有它应该已经编译失败,并且在运行时不会因 IllegalAccessError 而失败。

关于groovy - 如何使 Groovy 方法真正受到保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581927/

相关文章:

arrays - 具有嵌入式数组的JSON对象保存在Controller中

groovy - 史波克行为怪异

dictionary - 如果没有Java 8的Groovy中不存在,则放在 map 上

mysql - SOAPUI Groovy 解析 XML 响应并将其插入 mysql 数据库

groovy - 如何使用变量作为映射的关键部分

groovy - 找不到匹配方法 - JIRA/Groovy

java - Groovy 类未被收集但没有内存泄漏的迹象

ssl - Jenkins 工作-DSL : How to accept URL over Https with own root-ca signed certificate?

file-io - run-app 和 test-app 之间的 Griffon 资源加载差异

hibernate - 如何检查大写和小写的字符串