Как создать экземпляр пользовательского класса с помощью ToolBox.eval во время выполнения

Я написал следующий код.

import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

class A

object Main extends App {
  val tb = currentMirror.mkToolBox()
  tb.eval(tb.parse("new A"))
}

Этот простой код пытается создать экземпляр класса A, но scala выдает исключение.

[error] (run-main-0) scala.tools.reflect.ToolBoxError: reflective compilation has failed:
[error] 
[error] not found: type A
[error] scala.tools.reflect.ToolBoxError: reflective compilation has failed:
[error] 
[error] not found: type A
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:331)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.wrapInPackageAndCompile(ToolBoxFactory.scala:213)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:267)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.$anonfun$compile$13(ToolBoxFactory.scala:444)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.apply(ToolBoxFactory.scala:370)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:437)
[error]     at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scala:459)
[error]     at Main$.delayedEndpoint$Main$1(Main.scala:9)
[error]     at Main$delayedInit$body.apply(Main.scala:5)
[error]     at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]     at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]     at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]     at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error]     at scala.collection.immutable.List.foreach(List.scala:392)
[error]     at scala.App.main(App.scala:80)
[error]     at scala.App.main$(App.scala:78)
[error]     at Main$.main(Main.scala:5)
[error]     at Main.main(Main.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]     at java.lang.reflect.Method.invoke(Method.java:498)
[error] Nonzero exit code: 1
[error] (Compile / run) Nonzero exit code: 1

Однако не определенный пользователем класс, такой как Map, может создавать экземпляры; tb.eval(tb.parse("Map[String, Int]()")) работает хорошо.

Как я могу создать экземпляр пользовательского класса с помощью ToolBox?


person BitMaPT    schedule 03.07.2019    source источник
comment
stackoverflow.com/questions/56486653/   -  person Dmytro Mitin    schedule 04.07.2019


Ответы (1)


Вам нужно объявить класс A "в этой области":

import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox

object Main extends App {
  val tb = currentMirror.mkToolBox()
  tb.eval(tb.parse("class A; new A"))
}
person Pedro Correia Luís    schedule 03.07.2019
comment
Спасибо за ответ. Ваш ответ означает, что уже скомпилированный класс не может быть создан с помощью ToolBox? - person BitMaPT; 03.07.2019
comment
В основном вам нужно скомпилировать класс с помощью Toolbox, если вы этого не сделаете, это похоже на то, что вы находитесь в другой области. Кстати, голосование приветствуется ;) - person Pedro Correia Luís; 03.07.2019
comment
Я использовал import, чтобы поместить класс A в область видимости, и он выглядит нормально. благодарить. Кстати, карту можно использовать без специального процесса, потому что разработчик ToolBox поместил ее в область действия ToolBox? - person BitMaPT; 03.07.2019
comment
Что-то в этом роде, да - person Pedro Correia Luís; 03.07.2019