Scala相当于Java的静态块吗?(无配套对象)



scala有类似于类加载器对java中的静态块所做的事情吗?

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

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

我使用Scala2.x和ApacheSpark2.x

附言:我已经读过Scala与Java';s静态块?这个答案,但我不想创建伴随对象,然后通过类的构造函数调用它。

编辑:[我的用例]

考虑一个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中是一样的:除非加载该类时,不会执行该类中的静态块。

最新更新