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:我已经读过What is Scala equivalent of Java's static block?这个答案,但是我不想创建伴随对象,然后通过类的构造函数调用它。
编辑:[我的用例]
考虑一下Java的场景,我们在静态块内编写Class.forName(“ some.jdbc.driver”),然后将jdbc驱动程序放在类路径中。在该类加载器加载我们提到的类之后。我想做些完全一样的事情
答案 0 :(得分:4)
编辑:没有人提供太多希望,所以这里是指向the SIP for @static members的链接。已经是implemented for 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$
答案 1 :(得分:1)
我认为您引用的答案是唯一的答案。
如果具有以下代码,则仍需要引用该对象 以某种方式使初始化代码运行。
object StaticBlock {
println("init")
}
这在Java中是相同的:除非 加载该类后,该类中的静态块将不会执行。