无法从嵌套闭包访问私有静态字段

Private static field not accessible from a nested closure

假设我有以下 类:

@Slf4j
class MySuperclass {

    public void testMethod() {
        def test = [1, 2, 3]
        test.each {it ->
            log.info("gab" + it)
            def test2 = [4,5,6]
            test2.each {
                log.info("" + it)
            }
        }
    }
}

然后:

class MySubclass extends MySuperclass {

    public void process() {
        testMethod()
    }
}

当我调用 mySubclass.process() 时,出现错误:

No such property log for class: com.ingenuity.app.kang.batch.MySubclass

仅针对 test2 闭包内的行抛出错误。如果我声明一个 public 日志字段,它工作正常。如果我在子类中添加 @Slf4j 注释,它也可以正常工作。

我不明白这里发生了什么。这是 groovy 错误吗? 我发现这个问题可能是相关的,但它不是相同的行为: Groovy closure not work with static final field from super class

需要在MySuperClass中添加日志依赖,如:

import groovy.util.logging.Slf4j

@Grapes([
    @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.13') 
])

@Slf4j
class MySuperclass {
...
}

一种处理方法是将日志 属性 引用为 class 上的静态成员。 https://github.com/jeffbrown/logissue 的项目证明了这一点。

https://github.com/jeffbrown/logissue/blob/d089c296c102980855a88061275e52485965e4ab/src/main/groovy/logdemo/MySuperclass.groovy

package logdemo

import groovy.util.logging.Slf4j

@Slf4j
class MySuperclass {

    void testMethod() {
        def test = [1, 2, 3]
        test.each {it ->
            log.info("gab" + it)
            def test2 = [4,5,6]
            test2.each {
                MySuperclass.log.info("" + it)
            }
        }
    }
}

有效。

~ $ git clone git@github.com:jeffbrown/logissue.git
Cloning into 'logissue'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 22 (delta 0), reused 22 (delta 0), pack-reused 0
Receiving objects: 100% (22/22), 53.62 KiB | 1.28 MiB/s, done.
~ $ cd logissue/
  $ ./gradlew run

> Task :run
16:41:19.022 [main] INFO  logdemo.MySuperclass - gab1
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6
16:41:19.027 [main] INFO  logdemo.MySuperclass - gab2
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6
16:41:19.027 [main] INFO  logdemo.MySuperclass - gab3
16:41:19.027 [main] INFO  logdemo.MySuperclass - 4
16:41:19.027 [main] INFO  logdemo.MySuperclass - 5
16:41:19.027 [main] INFO  logdemo.MySuperclass - 6

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed