Как скаляк помечает скомпилированные файлы?
Посмотри на этот вопрос. Когда вы открываете .class
файл с включенным плагином scala (Intellij Idea) показывает код scala, но когда он выключен, плагин декомпиляции java показывает декомпилированный код java. Обратите внимание, что .class
файлы, которые компилируются javac
декомпилируется даже когда плагин Scala включен. Это означает, что плагин Scala "смотрит" на некоторые маркеры внутри файлов классов и перехватывает показ содержимого файла.
Какой маркер он на самом деле использует? Есть ли способ открыть .class
файл и изменение компилятора (и / или) другого infomartion, чтобы эти классы выглядели так, как будто они собраны javac
?
2 ответа
Каждый файл класса может иметь SourceFile
атрибут, который содержит имя файла исходного кода. Поскольку это произвольная строка, речь идет о соглашениях, например, для исходного кода Java, обычно она содержит только имя файла, без каких-либо специфичных для пакета каталогов.
Таким образом, информация по-прежнему немного интерпретируется, например, если указанное имя заканчивается на .java
среда IDE должна искать в известном исходном дереве соответствующий файл в подкаталогах, соответствующих фактическому пакету.
Определить, что исходный файл не является Java, так же просто, как распознать, что у него другое окончание имени файла, тогда можно использовать любое соглашение, используемое для конкретного языка, если плагин знает, что он установлен. В противном случае большинство IDE будут просто искать любой текстовый файл с таким именем и отображать его. Там может быть LineNumberTable
атрибуты, указывающие, как инструкции байт-кода отображаются на номера строк исходного кода, позволяя отладчикам проходить по коду даже без понимания синтаксиса исходного кода. Я уже прошел через код, скомпилированный из файла XSLT таким образом.
Конечно, шаблон указанного имени файла исходного кода также может быть использован, чтобы решить, какой декомпилятор использовать, когда исходный файл не был найден.
Intellij Idea
Intellij IDEA (при условии, что ваш вопрос касается этой IDE), просто выясняет, из какого исходного файла был скомпилирован двоичный файл, а затем отображает соответствующий источник.
Он не извлекает и не производит исходный код из двоичного файла. Он просто может найти источник для данного двоичного файла. Вы можете сделать это, сопоставляя имена файлов и пути. Intellij, вероятно, делает немного больше, хотя.
В общем
В общем, почти наверняка нет хорошего декомпилятора, который мог бы создавать исходники Scala из файлов классов. Кроме того, исходный код не встроен, поэтому все, чего вы можете достичь, это попытаться сопоставить файлы исходного кода с двоичными файлами.
Java-код, полученный при декомпиляции, - это то, что вы видите, когда IDE не может найти соответствующий исходный файл.