无法从嵌套闭包访问私有静态字段
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 的项目证明了这一点。
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
假设我有以下 类:
@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 的项目证明了这一点。
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