Некоторые методы содержат скомпилированный код?

Переходя к исходному коду некоторых классов, я увидел, что некоторые методы содержат скомпилированный код, и перед расширением они выглядят так:

public void someMethod(){

Скомпилированный код

}

При расширении метода вы можете видеть, что коды внутри него написаны как комментарий.

Смотрите один из методов из:sun.awt.shell.ShellFolder

    public boolean isFileSystem() {
     // 
     /* 0: aload_0
     * 1: invokevirtual #362  // Method getPath:()Ljava/lang/String;
     * 4: ldc           #7    // String ShellFolder
     * 6: invokevirtual #342  // Method java/lang/String.startsWith:(Ljava/lang/String;)
      /........
   */
      // 
    }

Мне интересно узнать больше об этих методах и о том, какой язык используется.

Можно ли написать собственный скомпилированный код?

 Azad27 июн. 2013 г., 01:38
@acdcjunior: Если бы вы опубликовали упражнение в качестве ответа, я бы сказал вам спасибо :) спасибо
 LanguagesNamedAfterCofee27 июн. 2013 г., 01:22
Обратите внимание, что если код не запутан, вы можете декомпилировать что-то вродеJD
 acdcjunior27 июн. 2013 г., 01:12
В качестве упражнения ищите инструмент под названиемjavap (это идет с JDK, какjavac). Сделайте это: скомпилируйте простой класс, скажемTest.java, зайдите в папку, где скомпилированTest.class это и делатьjavap -c Test.class, Вы'точно увидим0: aload_0 1: invokevirtual #362 вещи.
 Andrey Akhmetov27 июн. 2013 г., 01:24
@acdcjunior Это на самом деле обратный инжиниринг или эти метаданные хранятся внутри самого файла класса?
 acdcjunior27 июн. 2013 г., 01:09
Это Java. Тот'байт-код JVM (.class файл) реконструирован. Они показывают, что когда они нене иметь доступа к фактическому исходному коду.
 Azad27 июн. 2013 г., 01:37
@LanguagesNamedAfterCofee: я использую JD, но эти коды хранятся в.java файл и не может быть преобразован в код Java снова (я думаю).
 acdcjunior27 июн. 2013 г., 01:38
@ ObsessiveSSOℲ Технический термин "разбирать "(посмотреть здесь). Я считаю, что /aload_0invokevirtual являются действительными инструкциями файла класса (печатается как "хорошенький" строки, в реальном байт-коде они, вероятно, являются целочисленными кодами, каждый код представляет отдельную инструкцию), но некоторая информация определенно является метаданными, такими как номера строк, информация отладки (смотрите опцию -g здесь) так что.

Ответы на вопрос(2)

что IDE неИсточник не доступен (но код написан на Java).sun.* классы обычно несделать их источник доступным, потому что у них есть непубличный API. Это не должноне путать сnative код, который может быть написан на C / C ++ и вызываться через JNI / JNA.

Решение Вопроса

согласно комментарию).

Когда вам дается файл jar (например, rt.jar с JDK / JRE), он уже скомпилирован. Код высокого уровня, такой как:

HashMap<foo, bar=""> baz=Quuz.getInstance(); //This is obviously fake
</foo,>

превращается в низкоуровневый байт-код, который не читается человеком.

Этот байт-код содержит метаданные, такие как типы аргументов метода, и информацию, необходимую для загрузки этих классов и методов. Средам IDE необходимо предлагать завершение синтаксиса для библиотек (например, jar, которые вы добавляете в пути к классам проекта) и, что более важно, для загрузки и использования методов классов, которые вы получаете из этих библиотек.

"код" Здесь вы видите сводку и тип кода, называемый байт-кодом. Строка за строкой, инструкции какldc как видно из вашего примера, оперируйте небольшими частями стека, который одновременно поддерживает JVM. Этот байт-код довольно трудно читать и программировать вручную, поэтому ваш компилятор сгенерирует его для вас.

Все это (за исключением некоторых нативных методов) реализовано на языке, совместимом с JVM.

В зависимости от библиотеки и ее ограничений, а также вашей IDE 'с функциональностью, можно получить полный исходный код в другом пакете и "прикреплять" так что ваша IDE показывает исходный код вместо сгенерированного машиной резюме или декомпилирует его обратно в исходный код Java с той же функциональностью1.1

 Компилятор Java обычно выводит байт-код, который довольно легко преобразовать обратно в исходный код с той же функцией (не относится к другим скомпилированным языкам, таким как C / C ++). Можно запутать код с помощью инструмента, такого как Proguard, который заменяет идентификаторы на бессмысленные и может дополнительно преобразовывать определенные операции в весьма неясные с тем же результатом при выполнении.

 Andrey Akhmetov27 июн. 2013 г., 23:07
@ Инго Из любопытства можно ли определить используемый язык из скомпилированного файла классов? Это где-то в метаданных?
 Ingo27 июн. 2013 г., 02:05
Нет проблем. Большую часть времени этобудут будь ява в любом случае. Добавлено это только для полноты.
 Ingo28 июн. 2013 г., 20:51
Я думаю, что вы можете довольно хорошо, просто проверяя определенные шаблоны, такие как соглашения об именах, аннотации и т. Д. Например, язык Frege JVM компилируется в классы, которые имеют аннотации типа frege.runtime.Meta
 Andrey Akhmetov27 июн. 2013 г., 02:03
@ Инго Извините, я нене имеет большого опыта за пределами самой Java.
 Ingo27 июн. 2013 г., 01:59
Это неиметь быть Java. Может быть любой скомпилированный язык JVM.

Ваш ответ на вопрос