繁体   English   中英

Scala与Java的静态块等效吗? (没有伴随对象)

[英]What is Scala equivalent of Java's static block? (without companion object)

Scala是否具有类似于类加载器对Java中的静态块的作用?

例如类似于下面在scala中的东西:

class A{
static{

System.out.println("This gets called at the time of loading a class by class loader.")
}
}

我正在将Scala 2.x与Apache Spark 2.x一起使用

PS:我已经读过Scala与Java的静态块等效吗? 这个答案,但是我不想创建伴侣对象,然后通过类的构造函数调用它。

编辑:[我的用例]

考虑一下Java的场景,我们在静态块内编写Class.forName(“ some.jdbc.driver”),然后将jdbc驱动程序放在类路径中。 在该类加载器加载我们提到的类之后。 我想做那样的事情

编辑:没有人提供太大希望,所以这里是@static成员SIP的链接。 已经为Dotty / Scala 3实现了

但是,成员是在同伴上定义的。 成员定义的RHS可以包含任意代码,因此不需要静态初始化程序的语法。

仍然想知道用例是什么。

您的用例是什么?

通常:

scala 2.13.0-M4> object X { println("hi") }
defined object X

scala 2.13.0-M4> X
hi
res0: X.type = X$@554c4eaa

scala 2.13.0-M4> :javap -c X
Compiled from "<console>"
public class $line3.$read$$iw$$iw$X$ {
  public static $line3.$read$$iw$$iw$X$ MODULE$;

  public static {};
    Code:
       0: new           #2                  // class $line3/$read$$iw$$iw$X$
       3: invokespecial #20                 // Method "<init>":()V
       6: return

  public $line3.$read$$iw$$iw$X$();
    Code:
       0: aload_0
       1: invokespecial #21                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: putstatic     #23                 // Field MODULE$:L$line3/$read$$iw$$iw$X$;
       8: getstatic     #28                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
      11: ldc           #30                 // String hi
      13: invokevirtual #34                 // Method scala/Predef$.println:(Ljava/lang/Object;)V
      16: return
}

为了使您确信这是普通的静态加载:

scala 2.13.0-M4> :pa -raw
// Entering paste mode (ctrl-D to finish)

package y { object Y { println("hi") } }

// Exiting paste mode, now interpreting.


scala 2.13.0-M4> Class.forName
   def forName(x$1: String,x$2: Boolean,x$3: ClassLoader): Class[_]   def forName(x$1: String): Class[_]

scala 2.13.0-M4> Class.forName("y.Y$", true, getClass.getClassLoader)
hi
res5: Class[_] = class y.Y$

我认为您引用的答案是唯一的答案。

如果您有类似以下的代码,则仍需要以某种方式引用该对象以使init代码运行。

object StaticBlock {
  println("init")
}

在Java中是相同的:除非加载类,否则不会执行该类中的静态块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM