gpt4 book ai didi

java - 这与 Groovy 中的静态

转载 作者:行者123 更新时间:2023-11-29 04:27:28 25 4
gpt4 key购买 nike

在Java中:

protected static final Logger LOG = LoggerFactory.getLogger(this.getClass())

是不允许的,因为这意味着我们正在尝试从静态上下文访问非静态成员。

但是 Groovy 允许相同的代码段。怎么解决?

它会优先考虑静态从而使代码看起来像:

protected static final Logger LOG = LoggerFactory.getLogger(MyClass.class)

或者它会优先考虑非静态引用并使代码看起来像:

protected final Logger LOG = LoggerFactory.getLogger(this.getClass())

最佳答案

Groovy 添加静态构造函数来满足此初始化。看看下面的类:

import org.slf4j.Logger
import org.slf4j.LoggerFactory

class ClassWithLog {

protected static final Logger LOG = LoggerFactory.getLogger(this.getClass())

static void main(String[] args) {
LOG.info("Hello, world!")
}
}

让我们把它编译成.class文件:

groovyc -cp ~/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar ClassWithLog.groovy

现在让我们看看使用 javap 命令的字节码是什么样的:

javap -l -c ClassWithLog

我将跳过所有不相关的内容并直接转到:(可以在此处找到完整列表:https://gist.github.com/wololock/8d5a7cd049ef69a0d67567142e25b449)

  static {};
Code:
0: invokestatic #23 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
3: ldc #89 // int 1
5: aaload
6: ldc #91 // class org/slf4j/LoggerFactory
8: invokestatic #23 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
11: ldc #92 // int 2
13: aaload
14: ldc #2 // class ClassWithLog
16: invokeinterface #96, 2 // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.callStatic:(Ljava/lang/Class;)Ljava/lang/Object;
21: invokeinterface #44, 3 // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
26: astore_0
27: aload_0
28: ldc #98 // class org/slf4j/Logger
30: invokestatic #102 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
33: checkcast #98 // class org/slf4j/Logger
36: putstatic #36 // Field LOG:Lorg/slf4j/Logger;
39: aload_0
40: pop
41: return
LineNumberTable:
line 6: 0

正如您在列出的字节码中看到的那样,Groovy 添加了一个静态构造函数(我们还没有定义一个)并且它用 invokestatic 代替了 this.getClass() 在静态上下文中使用时。

如果我们从这个示例性 Groovy 类中删除第 6 行,然后将其编译为字节码,静态构造函数将不再存在。

删除静态日志字段后的完整字节码列表:https://gist.github.com/wololock/ad0284a0065166585dcba6a3db1475dc

关于java - 这与 Groovy 中的静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45543759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com