动态创建scala类

时间:2018-11-30 01:24:22

标签: scala reflection

我需要一种动态创建具有构造函数参数的类(而非对象)的方法(因此匿名类不适合)。

有一个库按名称使用类型,类型应具有带有单个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提供一些合适的代码生成功能?

0 个答案:

没有答案