Java-декомпиляция и перекомпиляция - PullRequest
1 голос
/ 13 июня 2009

У меня есть программа, в которой доступны некоторые классы Java. Можно их декомпилировать? Можно ли изменить исходный код класса и перекомпилировать его, не имея других файлов .class?

Например, предположим, у меня есть файл dog.class, который реализует подкласс животных, который определен в animal.class.

  • Могу ли я перекомпилировать dog.java без animal.class?
  • Можно ли перекомпилировать dog.java без animal.java?

Я не Java-разработчик, поэтому, пожалуйста, поправьте меня, если я не вижу смысла.

Ответы [ 6 ]

3 голосов
/ 13 июня 2009

Вам понадобится файл class для фактического использования класса, но это не значит, что вам понадобится исходный файл.

Давайте рассмотрим возможности на примере классов Dog и Animal. Предполагая, что класс Dog является подклассом класса Animal, мы можем сделать следующее:

  • Если у вас есть и Animal.class, и Animal.java, вы можете создать класс Dog.

  • Если у вас есть Animal.class, но не Animal.java, вы можете сделать Dog класс.

  • Если у вас нет Animal.class, но есть Animal.java, вы можете создать класс Dog. (Это означает, что файл Animal.java необходимо будет скомпилировать при компиляции файла Dog.java.)

  • Если у вас нет Animal.class или Animal.java, вы не можете создать класс Dog.

Вот табличная версия вышеприведенного:

 Have Animal.java?     Have Animal.class?       Can make Dog class?
 -----------------     ------------------       -------------------
        Yes                    Yes          -->          Yes
        Yes                    No           -->          Yes
        No                     Yes          -->          Yes
        No                     No           -->          No

Если у вас есть файл class, существуют программы, которые могут декомпилировать файл class для создания удобочитаемого исходного файла java, однако он не восстановит точный источник, который использовался для создания class файл.

Однако, в этом случае, если все, что необходимо, это расширить класс Animal для создания нового класса Dog, сам исходный код не требуется.

Имейте это в виду - всякий раз, когда класс создается на Java, он всегда расширяет класс Object. Даже если у нас нет доступа к исходному коду класса Object, поскольку у нас есть доступ к Object.class в Java, мы можем создавать свои собственные классы.

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

1 голос
/ 13 июня 2009

Если у вас есть доступ к скомпилированному классу (в вашем примере animal.class), то вы можете перекомпилировать подкласс (dog.java) (однако вам не нужен доступ к исходный код суперкласса).

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

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

1 голос
/ 13 июня 2009

В общем, нет. Однако вы можете сделать заглушки для этих отсутствующих классов (только для компиляции), а затем заменить их в оригинале, если они у вас есть.

0 голосов
/ 15 июня 2009

Мои 2 цента: некоторые декомпиляторы препятствуют декомпиляции на классах физического уровня (например, вы получите сбой во время процесса декомпиляции на некоторых декомпиляторах). Дополнительная проблема, с которой я столкнулся с декомпиляторами, лишь немногие из них поддерживают аннотации. В моем случае, когда я пытаюсь декомпилировать класс, у меня возникает тупик: код содержит аннотацию, но может быть декомпилирован без сбоя только с помощью декомпилятора , который не поддерживает аннотации.

0 голосов
/ 13 июня 2009

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

Обратите внимание, что ваш новый файл классов должен находиться "перед" исходными классами на пути к классам.

Также обратите внимание, что «запечатанные файлы jar» не позволяют этому трюку изменять классы.

0 голосов
/ 13 июня 2009

Просто чтобы добавить к другим ответам, один аспект, который вам, возможно, придется остерегаться: если у вашего класса сложные структуры, декомпилятор может не иметь возможности декомпилировать его в состояние «перекомпилируемо», и вам, возможно, придется отредактировать это вручную.

...