У меня есть несколько вариантов использования для этого, вокруг идеи взаимодействия между существующими библиотеками Java и новым кодом Scala. Вариант использования, который я выбрал, самый легкий, я думаю.Есть ли какой-нибудь способ создания нового объекта Scala из класса Java
Use Case:
Я работаю на предоставление JUnit Runner для некоторых тестов SCALA (так что я могу получить мой прекрасный красный/зеленый бар в Затмении) Бегун должен иметь конструктор с Java класс как параметр. Таким образом, в Scala я могу сделать следующее:
class MyRunner(val clazz: Class[Any]) extends Runner {
def getDescription(): Description
def run(notifier: RunNotifier)
}
Когда я использую либо
@RunWith(MyRunner)
object MyTestObject
или
@RunWith(MyRunner)
class MyTestClass
затем бегун действительно инстанцирован правильно, и передается соответствующий объект класса
К сожалению, теперь я хочу «ухватиться» за объект MyTestObject или создать M yTestClass, которые являются объектами Scala. Я бы предпочел использовать Scala Reflection, но я также хочу использовать стандартную банку Junit.
То, что я сделал
Следующие вопросы потока Stackover были образовательными, но не та же самая проблема. Были ближайшие вопросы, которые я мог бы найти
- How to create a TypeTag manually?
- Any way to obtain a Java class from a Scala (2.10) type tag or symbol?
- Using Scala reflection with Java reflection
дискуссию по Environments, Вселенных и зеркала в http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html было хорошо, и аналогичные документы на другой лестницу отражения также помогли. В основном это касается отражения Скалы.
Я просмотрел Скаладоки, но мне не хватало знаний о отражении Скала, чтобы я мог получить то, что хотел от них.
Edit: Как спросил здесь код класса, который создается за счет отражения
@RunWith(classOf[MyRunner])
object Hello2 extends App {
println("starting")
val x= "xxx"
}
Так самое интересное заключается в том, что решение, предложенное ниже, используя поле, называемое МОДУЛЬ $ ничего не печатает и значение x равно нулю
Я обнаружил, что вал экземпляр = clazz.getField («МОДУЛЬ $») получить (нуль) работает, чтобы получить. объект. Кажется, это немного «волшебный», это рекомендуемый способ? –
Этот вопрос очень хороший http://stackoverflow.com/questions/11020746/get-companion-object-instance-with-new-scala-reflection-api/11031443#11031443 –