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

2024-02-03

尝试在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(使用前将#替换为@)

如何使 Groovy 方法真正受到保护 的相关文章

随机推荐