2009-06-13 3 views
1

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

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

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

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

ответ

3

Вам потребуется 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

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

1

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

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

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

0

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

0

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

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

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

+0

Вам не нужны другие классы для декомпиляции. – shodanex

0

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