微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使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而失败.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐