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]
为什么需要使用反射来实例化它?为什么不在代码中调用构造函数呢?如果愿意分享您的实际用例,可能有比反射更好的选择。