Декомпилировать JavaEE - PullRequest
       9

Декомпилировать JavaEE

3 голосов
/ 27 января 2010

У нас есть приложение Java EE, поставщик которого больше не существует (из-за банкротства). К сожалению, мы должны внести некоторые изменения в функциональность приложения, и это означает реверс-инжиниринг приложения JavaEE.

Мы используем JD-GUI для реинжиниринга около 70% приложений / классов, а затем настраиваем их вручную для создания Eclipse.

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

Edit:

Это один из примеров трудностей:

return ((SchemaTypeSystem)Class.forName(
    "org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl",
    true,
    class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())
        .getConstructor(new Class[] { Class.class })
        .newInstance(new Object[] { TypeSystemHolder.class }));

Трудно понять, что такое

class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())

Ответы [ 2 ]

4 голосов
/ 01 февраля 2010

Дайте JAD (http://www.varaneckas.com/jad) попробовать.

Показанный вами проблемный код эквивалентен следующему:

1) Class class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder;
2) ClassLoader loader = class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader();
3) Class type = Class.forName("org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl", true, loader);
4) Constructor ctor = type.getConstructor(Class.class);
5) Object obj = ctor.newInstance(TypeSystemHolder.class);
6) SchemaTypeSystem result = (SchemaTypeSystem) obj;
7) return result;

Часть, с которой у вас возникают проблемы, это строка 1, которая представляет локальную переменную или поле (возможно, статическое). Компилятор Java преобразует выражение «TypeSystemHolder.class» в вызов getClass, сохраняющий результат в статическом поле. Эта инициализация происходит один раз в каждом классе, который ссылается на «TypeSystemHolder.class», и компилятор заменяет каждый вызывающий объект, который использует это выражение, на доступ к полю.

Большинство декомпиляторов не могут преобразовать эту идиому обратно в исходный вызов TypeSystemHolder.class, но JAD справляется с этим довольно хорошо. Кроме того, существует плагин, который интегрирует JAD (и другие) в Eclipse (http://jadclipse.sourceforge.net).

К сожалению, декомпиляторы не обрабатывают каждую последовательность кода, сгенерированную компилятором, поэтому всегда требуется некоторое переписывание вручную. Например, компилятор Java может генерировать код для одного блока обработки исключений, который перекрывается с кодом для другого блока обработки исключений. Декомпиляторы не могут разделить это обратно на два блока catch. В этом случае обычно все операторы goto видны в коде (не на Java), или декомпилятор просто отказывается от этого метода.

Кроме того, вы правы, что это сгенерированный код. В частности, это от компилятора XmlBeans, который анализирует XML-схему xn и генерирует классы привязки для Java; позволяя serailize и десериализовать XML-документы, соответствующие этой схеме. Если у вас есть доступ к схеме, было бы лучше включить XmlBeans в вашу сборку, а не декомпилировать эти классы.

0 голосов
/ 09 февраля 2010

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

Кроме того, если вы делаете только небольшие изменения, вы можете просто атаковать файлы по отдельности и оставить остальные нетронутыми.

...