2013-10-13 2 views
1

Поскольку имя класса scala может не совпадать с именем исходного файла.scala - получить имя класса/исходного файла и позицию символа

Как найти файл .class в банке, к которой относится тип scala.

В типа scala.reflect.api.Symbols.Symbol есть значение, называемое associatedFile, но она всегда возвращает нуль

scala> typeOf[List[_]].typeSymbol.associatedFile 
res4: scala.reflect.io.AbstractFile = null 

Как я могу получить имя файла класса программно?

Подробнее: Если я получаю двоичную/исходную банку, например scala-library.jar, scala-library-src.jar. Как я могу определить, какой исходный файл в исходном банке поступает из класса в двоичном банке.

Может ли компилятор презентации Scala рассказать об этой информации?

+1

Это известная проблема: https://issues.scala-lang.org/browse/SI-7044 –

+0

Время выполнения на самом деле неважно, где находятся источники, поскольку он работает с скомпилированными файлами '.class'. Я не говорю, что «ярлык» (не обычное) решение не существует, но я искренне сомневаюсь, что это часть стандарта **, если ** это так. Конечно, вы всегда можете разработать алгоритм доморощенного, но я сомневаюсь, что это то, что вы хотите. –

+0

@TheTerribleSwiftTomato Как вы думаете, индекс исходной банки и сохранение класса -> отношение источника для использования во время выполнения - хорошая идея? – jilen

ответ

1

associatedFile возвращает исходный файл, что символ определен в - используется в макросах, во время выполнения отражение не имеет такой информации, и именно поэтому вы получаете null с.

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

import scala.reflect.runtime.universe._ 
val mirror = runtimeMirror(getClass.getClassLoader) 
val clazz = mirror.runtimeClass(typeOf[List[_]]) 

Полное имя класса должно отображаться относительный путь файлов классов в довольно простым способом:

clazz.getName.replace('.', '/') + ".class" 

но вы должны знать, что классы времени выполнения не всегда загружаются из файлов классов, различные загрузчики классов могут извлекать их из разных источников разными способами (например, генерировать их «на лету» во время выполнения). Кроме того, точное местоположение файла classfile является детальностью реализации ClassLoader, которую вы не можете знать в общем случае.

+0

Я подробно изложил свой вопрос. Файл класса может быть найден по имени типа, как идет исходный файл, можете ли вы посмотреть? – jilen

Смежные вопросы