生成access $方法

时间:2019-06-06 17:10:51

标签: groovy

我们使用AST转换将代码注入到groovy脚本中。我们静态地编译脚本。

在脚本中

  1. 有私有功能
  2. 这些私有函数在其他函数的闭包中访问
  3. 这将导致在静态编译后生成access $ 0函数
  4. 静态编译之后,我们将方法调用的目标切换到另一个(生成的)方法,该方法的签名与原始方法匹配,除了一些额外的参数(将其视为AOP样式编程)

我们注意到了

  1. 如果不切换方法目标,groovy将使用access $ 0函数从闭包内部调用私有函数
  2. 由于我们在静态编译之后切换了方法的目标,所以对于我们注入的新方法,不会生成access $函数
  3. 当我们切换目标时,groovy / javac看到私有方法没有access $方法,因此使用动态调用来调用新方法。

这似乎可以接受,但是为了进一步优化,我们如何为注入的新方法生成access $函数?是否有一种方法可以始终生成这些方法或重新评估该类,以确定需要生成哪种访问方法?

我们尝试在切换目标方法后再次运行静态编译注释。它并没有改变生成的访问方法。

我们如何让编译器重新评估必须生成哪些访问方法?

这段代码就是脚本中的内容

private function1() {
  // Do somethig
}

public functionThatUsesClosure(Closure a) {
   a.call()
}

public parentFunction() {

  functionThatUsesClosure {
    function1()
  }
}

使用AST转换将其转换为此

private function1() {
  // Do something
}

private function1(MyExtraParameter param) {
  // Do something
}

public functionThatUsesClosure(Closure a) {
   a.call()
}

public parentFunction() {

  functionThatUsesClosure {
    function1(new MyExtraParameter())
  }
}

当我使用javap检查类文件时,我看到一个与function1()匹配的额外的access $ 0函数。但是,不再使用function1(),而是在闭包中使用其function1(MyExtraParameter)。这意味着access $ 0函数必须已映射到function1(MyExtraParameter)

该代码将在没有access $ 0函数的情况下工作,因为groovy会动态调用正确的函数,但是我想知道是否存在一种方法,可以通过告诉Groovy生成一个access $ 1函数来对其进行优化。我注入的代码

0 个答案:

没有答案