Subject to the number of cunstructor arguments, how do I create new instance from class name?
def instantiate(className:String)(args:Any*): AnyRef = { val clazz = Class.forName(className) val constructor = clazz.getConstructors()(0) val constNum = constructor.getParameterTypes().length val workArgs:Array[AnyRef] = new Array(constNum) var count=0 for(arg <- args if(count < workArgs.length)){ workArgs(count) = arg match{ case i:AnyRef => i case i:Int => new java.lang.Integer(i) case i:Long => new java.lang.Long(i) case i:Float => new java.lang.Float(i) case i:Double => new java.lang.Double(i) case i:Boolean => new java.lang.Boolean(i) case i:Char => new java.lang.Character(i) case i:Byte => new java.lang.Byte(i) case i:Short => new java.lang.Short(i) case _ => arg.asInstanceOf[AnyRef] } count = count + 1 } return constructor.newInstance(workArgs:_*).asInstanceOf[AnyRef] }
or
you can write recursion instead of for loop below:
private def instantiate(className:String)(args:Any*): AnyRef = { println(className) val clazz = Class.forName(className) val constructor = clazz.getConstructors()(0) val constNum = clazz.getConstructors()(0).getParameterTypes().length val workArgs:Array[AnyRef] = new Array(constNum) def checkArg(count:Int) { if(count<workArgs.length&&count<args.length){ checkArg(count+1) workArgs(count) = args(count) match{ case i:AnyRef => i case i:Int => new java.lang.Integer(i) case i:Long => new java.lang.Long(i) case i:Float => new java.lang.Float(i) case i:Double => new java.lang.Double(i) case i:Boolean => new java.lang.Boolean(i) case i:Char => new java.lang.Character(i) case i:Byte => new java.lang.Byte(i) case i:Short => new java.lang.Short(i) case _ => args(count).asInstanceOf[AnyRef] } } } checkArg(0) return constructor.newInstance(workArgs:_*).asInstanceOf[AnyRef] }
I would like to get your feedback