Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用class.forName()初始化具有带参数的构造函数的类_Scala - Fatal编程技术网

Scala 使用class.forName()初始化具有带参数的构造函数的类

Scala 使用class.forName()初始化具有带参数的构造函数的类,scala,Scala,我有一门课是这样的: class NotNullValidationRule(val columns: Set[String], override val acceptanceMin: Double = Constants.DefaultAcceptanceMin) 我正在尝试实例化一个这样的类 val param = Set("person_id","participant_id") val obj = Class.forName

我有一门课是这样的:

 class NotNullValidationRule(val columns: Set[String],
                            override val acceptanceMin: Double = Constants.DefaultAcceptanceMin)
我正在尝试实例化一个这样的类

 val param = Set("person_id","participant_id")
 val obj = Class.forName("NotNullValidationRule").getConstructor(Set.getClass).newInstance(param)
我也在测试:

 val obj = Class.forName("NotNullValidationRule").getConstructor(classOf[String]).newInstance(param)
我没有成功,因为这个错误使我:

Exception in thread "main" java.lang.NoSuchMethodException: com.hammu.rules.validity.NotNullValidationRule.<init>(scala.collection.immutable.Set$)
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getConstructor(Class.java:1825)
    at com.hammu.run2$.delayedEndpoint$com$bluetab$hammu$run2$1(run2.scala:12)
    at com.hammu.run2$delayedInit$body.apply(run2.scala:7)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:392)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)
    at com.hammu.run2$.main(run2.scala:7)
    at com.hammu.run2.main(run2.scala)
线程“main”java.lang.NoSuchMethodException中的异常:com.hammu.rules.validity.NotNullValidationRule.(scala.collection.immutable.Set$) 位于java.lang.Class.getConstructor0(Class.java:3082) 位于java.lang.Class.getConstructor(Class.java:1825) 在com.hammu.run2$.delayedEndpoint$com$bluetab$hammu$run2$1(run2.scala:12) 在com.hammu.run2$delayedInit$body.apply上(run2.scala:7) 在scala.Function0$class.apply$mcV$sp处(Function0.scala:34) 在scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)中 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.collection.immutable.List.foreach(List.scala:392) 位于scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 位于scala.App$class.main(App.scala:76) com.hammu.run2$.main(run2.scala:7) 位于com.hammu.run2.main(run2.scala)
请帮帮我。

Java没有默认参数,这是Scala编译器提供的魔法

如果您想使用反射(顺便问一下,为什么?),您必须像从Java调用方法一样调用该方法,这意味着您必须选择带有两个参数的方法签名(谢天谢地,没有多个参数组或隐式!),并同时为这两个参数提供值


但同样:反射是最后的手段,特别是在Scala中。肯定有更好的方法来实现您的用例。

不要认为您可以忽略第二个contstructor参数
val obj=Class.forName(classOf[NotNullValidationRule].getName)。getConstructor(classOf[Set[String]],classOf[Double])。newInstance(param,i)。asInstanceOf[NotNullValidationRule]
为什么需要使用反射来实例化它?为什么不在代码中调用构造函数呢?如果愿意分享您的实际用例,可能有比反射更好的选择。