Мне нужен способ динамического создания класса (не объекта), который имеет аргументы конструктора (поэтому анонимные классы не подходят).
Существует библиотека, которая использует тип по имени, и тип должен иметьконструктор с одним параметром 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
для печати 2 разных чисел:
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 предоставляет некоторые подходящие возможности генерации кода?