Dynamic 使用方法引用时groovy方法作用域

Dynamic 使用方法引用时groovy方法作用域,dynamic,methods,groovy,Dynamic,Methods,Groovy,我有一个groovy类,它查找一个方法引用,然后调用它。正在调用的方法是私有方法。当实际类是子类的实例时,它会抛出一个错误,即它找不到私有方法,即使父类中实际调用它的是公共方法 在这种情况下,我显然可以直接调用pMethod2(),这样做是可行的,但我试图理解为什么它不能像编写的那样工作,以及是否有办法纠正它,使其工作 class Parent { def pMethod1() { def m = this.&pMethod2 m() // this call fa

我有一个groovy类,它查找一个方法引用,然后调用它。正在调用的方法是私有方法。当实际类是子类的实例时,它会抛出一个错误,即它找不到私有方法,即使父类中实际调用它的是公共方法

在这种情况下,我显然可以直接调用
pMethod2()
,这样做是可行的,但我试图理解为什么它不能像编写的那样工作,以及是否有办法纠正它,使其工作

class Parent {

  def pMethod1() {
    def m = this.&pMethod2
    m() // this call fails if the calling class is of type Child
  }


  private def pMethod2() {}

  public static void main(String[] args) {
    new Child().pMethod1();
  }
}

class Child extends Parent {}

这有点让人困惑,尤其是如果你习惯了C/C++。在Groovy中使用“&”操作符得到的不是地址,而是MethodClose的实例

MethodClose对象包含所有者和委托对象,在解析要调用的方法时使用。在您的示例中,所有者和委托对象将是“this”,它是Child的一个实例。要调用的方法仅存储为字符串

那么,任务呢

m = this.&pMethod2
这只是一种简写的写作方式

m = new MethodClosure(this, "pMethod2")
当您调用m()闭包时,它将尝试(在运行时)通过分别在所有者和委托对象中查找名为“pMethod2”的方法来解析该方法。由于所有者和委托是子对象的实例,因此它将找不到位于父对象中的私有方法

要使示例正常工作,必须确保闭包的所有者和/或委托人可以看到该方法

这可以通过多种方式实现,例如,将pMethod2的访问修饰符更改为protected,或者使用Parent的实例创建闭包;大概是这样的:

m = new Parent().&pMethod2

请注意,在pMethod2实际可见的方法中创建MethodClosure实例与此无关。在闭包可见的方法中调用闭包也是不相关的。该方法对于方法关闭的所有者或委托是不可见的,这是解决该方法时使用的方法。

< P>这有点令人困惑,尤其是如果您习惯于C/C++。在Groovy中使用“&”操作符得到的不是地址,而是MethodClose的实例

MethodClose对象包含所有者和委托对象,在解析要调用的方法时使用。在您的示例中,所有者和委托对象将是“this”,它是Child的一个实例。要调用的方法仅存储为字符串

那么,任务呢

m = this.&pMethod2
这只是一种简写的写作方式

m = new MethodClosure(this, "pMethod2")
当您调用m()闭包时,它将尝试(在运行时)通过分别在所有者和委托对象中查找名为“pMethod2”的方法来解析该方法。由于所有者和委托是子对象的实例,因此它将找不到位于父对象中的私有方法

要使示例正常工作,必须确保闭包的所有者和/或委托人可以看到该方法

这可以通过多种方式实现,例如,将pMethod2的访问修饰符更改为protected,或者使用Parent的实例创建闭包;大概是这样的:

m = new Parent().&pMethod2
请注意,在pMethod2实际可见的方法中创建MethodClosure实例与此无关。在闭包可见的方法中调用闭包也是不相关的。MethodClosure的所有者或委托人看不到该方法,解析该方法时将使用该方法