Динамически создавать класс Scala - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужен способ динамического создания класса (не объекта), который имеет аргументы конструктора (поэтому анонимные классы не подходят).

Существует библиотека, которая использует тип по имени, и тип должен иметьконструктор с одним параметром 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 предоставляет некоторые подходящие возможности генерации кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...