我需要一种动态创建具有构造函数参数的类(而非对象)的方法(因此匿名类不适合)。
有一个库按名称使用类型,类型应具有带有单个String参数的构造函数。通过反射找到并执行构造函数以创建该类的实例:
class Base(path: String) {
// some code here
}
def createClass(className: String): Unit = {
val clazz: Class[_] = Class.forName(className).asInstanceOf[Class[Base]]
val ctor: Constructor[_] = clazz.getDeclaredConstructor(classOf[String])
val outputPath: String = "Dummy" // provided dynamically by framework
ctor.newInstance(outputPath)
}
我想提供一个代码,该代码将调用createClass
方法来打印两个不同的数字:
printDynamic(42) // int values are generated after program starts
printDynamic(24)
问题:如何以没有硬编码或全局变量的方式实现printDynamic?
我当前的实现使用全局变量:
def execDynamic(param: Int): Unit = {
Holder.externalValue = param
createClass("com.test.StaticPrinter")
}
... other file
package com.test
class StaticPrinter(path: String) extends Base(path) {
println(path + Holder.externalValue)
}
object Holder {
var externalValue: Int = _
}
我想即时生成课程,但是我不知道这样做的方法。像这样:
def execDynamic(param: Int)= {
val clazz: Class[_] = magicallyCreateClass_WithSingleStringConstructor(param)
createClass(clazz.getName)
}
我会为此被迫做字节码操作,还是scala提供一些合适的代码生成功能?