Понимание байт-кода Java

В TDD Вы пишете спецификации системного поведения и используете их для управления дизайном системы. Вы пишете один тест для одного крошечного поведения, затем наблюдаете тест, чтобы привести к сбою, и затем написать код, чтобы пройти тест. В любом случае Вы сохраняете качество кода максимально высоко путем рефакторинга регулярно, так, чтобы внесение большего количества изменений было легче.

Примеры того, как сделать TDD: http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata

Также видит мой ответ от стандарты Записи для поблочного тестирования - это имеет примеры и ссылки для получения дополнительной информации. Вот также хорошие ссылки для следования: http://code.google.com/p/instinct/wiki/UsersGuide

17
задан hhafez 12 October 2009 в 01:28
поделиться

6 ответов

Rather than looking directly at the Java bytecode, which will require familiarity with the Java virtual machine and its operations, one could try to use a Java decompiling utility. A decompiler will attempt to create a java source file from the specified class file.

The How do I “decompile” Java class files? is a related question which would be informative for finding out how to decompile Java class files.

That said, one could use the javap command which is part of the JDK in order to disassemble Java class files. The output of javap will be the Java bytecode contained in the class files. But do be warned that the bytecode does not resemble the Java source code at all.

The definite source for learning about the Java bytecode and the Java Virtual Machine itself would be The Java Virtual Machine Specification, Second Edition. In particular, Chapter 6: The Java Virtual Machine Instruction Set has an index of all the bytecode instructions.

18
ответ дан 30 November 2019 в 12:00
поделиться

Чтобы просмотреть инструкцию по байт-коду файлов классов, используйте команду javap -v так же, как если бы вы запускали java-программу, указав путь к классам (при необходимости) и имя класса.

Пример:

javap -v com.company.package.MainClass

О наборе команд байт-кода, Сводка набора инструкций

14
ответ дан 30 November 2019 в 12:00
поделиться

Fernflower - это аналитический декомпилятор, поэтому он декомпилирует классы в читаемый код Java вместо байт-кодов. Это гораздо полезнее, если вы хотите понять, как работает код.

2
ответ дан 30 November 2019 в 12:00
поделиться

Я знаю, что это не совсем ответ на ваш вопрос, но на него стоит указать. В F # и других функциональных языках вы часто видите модули со статическими методами (например, модуль Seq), которые предназначены для объединения с другими функциями. Насколько я видел, методы экземпляра составить нелегко, и это одна из причин, по которой существуют эти модули. В случае этого расширения вы можете захотеть добавить функцию к модулю String.

module String =
    let right n (x:string) =
        if x.Length <= 2 then x
        else x.Substring(x.Length - n)

Затем она будет использоваться так.

"test"
|> String.right 2 // Resulting in "st"

["test"; "test2"; "etc"]
|> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]

Хотя в этом случае метод расширения не будет намного больше кода. из командной строки Linux)

Инструмент javap (с параметром -c) дизассемблирует файл с байт-кодом. Он запускается из командной строки и поставляется как часть Java SDK.

2) Какие хорошие ссылки для ознакомления с синтаксисом байтового кода Java

Инструмент javap использует тот же синтаксис as используется в спецификации JVM, и, естественно, окончательным источником является спецификация JVM. Я также заметил «Внутри виртуальной машины Java» Билла Веннерса. Я никогда его не читал, и похоже, что он может быть распродан.

Фактический (текстовый) синтаксис прост и не требует пояснений ... при условии, что у вас есть ссылка, объясняющая, что делают байт-коды, и что вы умеренно знакомы с чтением кода на этом уровне. Но, вероятно, будет проще прочитать вывод декомпилятора,

0
ответ дан 30 November 2019 в 12:00
поделиться

Если у вас есть класс и нет исходного кода, но есть ошибка, вы можете сделать одно из двух основных действий:

  1. Декомпилировать, исправить ошибку и воссоздать файл jar. Я делал это раньше, но системные администраторы с подозрением относятся к внедрению этого в производство.
  2. Напишите модульные тесты для класса, определите, что вызывает ошибку, сообщите об ошибке с помощью модульных тестов и дождитесь ее исправления.

    По моему опыту, системные администраторы, как правило, предпочитают (2).

    Если вы выберете (2), то тем временем, поскольку вы знаете, что вызывает ошибку, вы можете либо не разрешить, чтобы этот ввод попадал в класс, чтобы предотвратить проблему или быть готовым правильно обработать ее при возникновении ошибки.

    Вы также можете использовать AspectJ для внедрения кода в проблемный класс и изменения поведения метода без фактической перекомпиляции. Я думаю, что это может быть предпочтительным вариантом, поскольку вы можете изменить его для всего кода, который может вызывать функцию, не беспокоясь о том, чтобы рассказать всем о проблеме.

    Если вы научитесь читать инструкции байт-кода, что вы сделаете для решения проблемы?

1
ответ дан 30 November 2019 в 12:00
поделиться

Вы можете найти плагин Eclipse Byte Code Outline полезным:

http://andrei.gmxhome.de/bytecode/index.html

Я сам не использовал его - просто видел это упомянуто мимоходом.

0
ответ дан 30 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: