Любой способ получить класс Java из тега или символа типа Scala (2.10)? - программирование
Подтвердить что ты не робот

Любой способ получить класс Java из тега или символа типа Scala (2.10)?

Похоже, что это меня закрыло, но (а) не совсем (см. ниже), и (б) использование строкового представления имени похоже на взлома...

scala> import scala.reflect.runtime.universe._import scala.reflect.runtime.universe._

scala> val t = typeOf[Int]
t: reflect.runtime.universe.Type = Int

scala> t.typeSymbol.asClass.fullName
res0: String = scala.Int

scala> object X { class Y } 
defined module X

scala> val y = typeOf[X.Y]
y: reflect.runtime.universe.Type = X.Y

scala> Class.forName(y.typeSymbol.asClass.fullName)
java.lang.ClassNotFoundException: X.Y [...]

Не хватает ли я более прямого метода доступа к этой информации? Или это будет лучше, если мне также понадобится информация о классе в какой-то момент, просто чтобы сохранить параллельный набор информации о Java-классе? (Тьфу!)

4b9b3361

Ответ 1

Получение java.lang.Class или создание объектов с отражением должно выполняться с помощью зеркала, а не с типами и символами, которые являются информацией времени компиляции для Scala:

scala> val m = runtimeMirror(getClass.getClassLoader)
m: reflect.runtime.universe.Mirror = JavaMirror with ...

scala> m.runtimeClass(typeOf[X.Y].typeSymbol.asClass)
res25: Class[_] = class X$Y

Ответ 2

Предполагая, что tag является тегом типа класса, для которого вы хотите получить класс java, вы можете сказать:

val mirror = tag.mirror
val clazz = mirror.runtimeClass(tag.tpe.typeSymbol.asClass)

В основном то же самое, что и ответ sschaef, за исключением того, что вы должны использовать зеркало непосредственно из тега, вместо того, чтобы использовать зеркало текущего класса classloader. Если текущий класс и другой класс, у которого у вас есть тег для использования разных загрузчиков классов, в этом случае у вас будет ошибка загрузки классов, но не ошибка в том, как я объяснил.

Переменная clazz будет содержать класс java для того, что вы пытаетесь получить.